【HAL库&CubeMX】4-TIM配置产生 PWM

参考文章:w我想吃西瓜nSTM32CubeMX——PWM配置》

一、使用CubeMX进行基本配置

1、选择定时器通道

随便选择一个为例子,TIM1channel 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选项的思路还是有很大不同的。

 

posted @ 2023-07-03 21:42  FBshark  阅读(2000)  评论(0编辑  收藏  举报