使用的硬件为野火的骄阳STM32F407IGT6控制板。
通过CUBE MX设置定时器,产生2路PWM波形,控制有刷直流电机;
大概的设置过程如下:
1,开通TIM1高级定时器,预分频器Prescaler设置为84-1,计数周期Counter Period设置为5000-1
实际得到的TIM1定时器时钟频率为84000000/84/5000=200Hz,
2,设置计数模式为:Up向上计数
3,设置Channel1和Channel2为PWM输出模式:PWM Generation CH1和PWM Generation CH2
通过修改auto_reload perload值为“enable”和“disable”对比发现,该选项不影响PWM波的正常输出。
通过修改Clock_Source值为“Internal Clock”和“disable”对比发现,该选项也不影响PWM波的正常输出,具体原因不明,可能是有默认的时钟来源吧。
通过CUBE MX自动生成的文件并不能直接使用,需要作如下2个修改:
1,手动开启定时器的PWM输出通道:“HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);,加在main()函数中,和其它初始化函数一起在程序启动时运行
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //开启定时器PWM通道1
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);//开启定时器PWM通道2
/* USER CODE END 2 */
2,在 while (1)死循环中增加占空比设置函数——__HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_x,0);
具体代码如下:
while (1)
{
/* USER CODE END WHILE */
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,500);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,1500);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,2000);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
通过以上代码,将L298N电机驱动板的控制信号输出脚接至定时器PWM信号输出引脚,发现电机每隔1000ms就改变一次运行速度,代码测试成功。