【HAL库&CubeMX】4-TIM配置产生 PWM
参考文章:w我想吃西瓜n《STM32CubeMX——PWM配置》
一、使用CubeMX进行基本配置
1、选择定时器通道
随便选择一个为例子,TIM1
的channel 1
有一个 Clock source 的选项。可选 Internal Clock 和 ETR2。
对于通用定时器和高级定时器,可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
这里咱们不使用,直接选择 Internal Clock就行。
2、对TIM2 channel1的预分频器、自动重装值等进行设置
时钟配置的是72MHZ的,预分频器就设置的71
关于PWM的模式选择
(1)、PWM mode 1:
在向上计数中,当计数值小于CCR值时输出高电平,计数值大于CCR值时输出低电平;在向下计数中,当计数值小于CCR值时输出低电平,计数值大于CCR值时输出高电平;
(2)、PWM mode 2:
在向上计数中,当计数值小于CCR值时输出低电平,计数值大于CCR值时输出高电平;在向下计数中,当计数值小于CCR值时输出高电平,计数值大于CCR值时输出低电平;
PWM频率:Freq = CK_PSC/(PSC+1)/(ARR+1)
PWM占空比:Duty = CRR/(ARR+1)
PWM分辨率:Reso = 1/(ARR+1)
二、在keil 5 中进一步完善
1、开启定时器1的通道1的PWM输出
在stm32f1xx_hal_tim.c
里面找到HAL_TIM_PWM_Start()
函数开启定时器1的通道1的PWM输出
1 /* USER CODE BEGIN TIM2_Init 2 */ 2 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); 3 /* USER CODE END TIM2_Init 2 */**
在主函数里面或者其它地方都可以,我是在定时器的初始化里面开启的
2、改变CCR的值(改变占空比)
有两种方法,一种是调用hal库里面的__HAL_TIM_SetCompare()
函数,还有一种就是直接操作寄存器`
1 /* USER CODE BEGIN 2 */ 2 int speed=0; 3 __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,speed); 4 TIM2->CCR1 = speed; 与上方作用相同 5 /* USER CODE END 2 */
X-记录调试电路的坑:
调试电机,发现速度如何都调节不了。
最终发现模块安装错了,把 DRV8833 当作 TB6612 了。换回来之后,能调速了,但是又有新问题——
就是一个电机转,另一个电机怎么也不转。
然后发现是 CubeMX 里面的一个输出通道选择普通的输出比较了,没选择PWM输出模式。
改了之后发现:还是不转。
绝望之中,把下面代码中的L_Forward_Roll() 代码改为 HAL_GPIO_WritePin()代码,结果能转了???
然后改回来,结果还能转。。。。(真是灵异事件
一种猜想是:MDK没重新编译?
编译的时候尽量选两个箭头的那个,工程完全重新编译一遍。另外确认选上魔术棒里面的 Reset and run 选项。
不过,综上,还是要注意自己硬件模块的安装和CubeMX 的配置,尤其TIM这个复杂外设,原来学的标准库与CubeMX选项的思路还是有很大不同的。