本文共 2458 字,大约阅读时间需要 8 分钟。
1、在main函数中开启基础定时器TIM6的中断HAL_TIM_Base_Start_IT(&htim6);
,该函数一定要在初始化完成之后再开启
int main(void){ ... /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); MX_TIM6_Init(); /* Initialize interrupts */ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim6); printf("2020.11.28 \n"); while (1){ }}
2、在tim.c文件中实现中断函数
/* USER CODE BEGIN 1 */void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim == &htim6) { printf("i am htim6-- \r\n"); }}/* USER CODE END 1 */
我在2018年的使用STM32CubeMX测试基础定时器,将HAL_TIM_Base_Start_IT(&htim6);
放在如下函数中,可正常使用。
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle){ if(tim_baseHandle->Instance==TIM6) { /* USER CODE BEGIN TIM6_MspInit 0 */ /* USER CODE END TIM6_MspInit 0 */ /* TIM6 clock enable */ __HAL_RCC_TIM6_CLK_ENABLE(); /* USER CODE BEGIN TIM6_MspInit 1 */ HAL_TIM_Base_Start_IT(&htim6); /* USER CODE END TIM6_MspInit 1 */ }}
现在生成的代码,这样配置不正常,需要将HAL_TIM_Base_Start_IT(&htim6);
放在main函数初始化之后,可能是STM32CubeMX的版本升级的原因吧。
1、开启通道1的PWM
int main(void){ ... /*系统其他的初始化*/ MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/ while (1) { }}
产生的PWM
void TIM_SetTIM3Compare1(uint32_t compare){ TIM3->CCR1=compare; }int main(void){ ... /*系统其他的初始化*/ MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/ TIM_SetTIM3Compare1(20); while (1) { }}
产生的占空比
舵机的控制:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的: 0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。要精确的控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。如果你拿了个舵机,连控制精度为1度都达不到的话,而且还看到舵机在发抖。在这种情况下,只要舵机的电压没有抖动,那抖动的就是你的控制脉冲了。而这个脉冲为什么会抖动呢?当然和你选用的脉冲发生器有关了。 如果PWM一直输出某个占空比,舵机会一直停留在某个位置。转载地址:http://ljkb.baihongyu.com/