占空比可调方波往往用来进行电机转速控制,而我恰好想等同学画完HFSS好一起回宿舍,写个文章介绍一下基于STM32CUBEMX的STM32F103C8占空比可调方波配置流程。测试源码在最下面!!!
首先是时钟配置:
我这边全部使用的是外部晶振,晶振频率是8M,因此在STM32CUBEMX需要进行相关配置。
首先需要把SYSTEM CORE里面的RCC进行参数调整,把高速外部时钟与低速外部时钟全部设置为外部陶瓷晶体,配置图如下(Crystal那个就是):
随后进行时钟树配置,我这边使用的是8M的外部时钟,因此需要配置外部时钟为8M,童鞋们根据自己实际情况做相应调整。
这里直接把速率拉满到最高的72M,CUBE会对锁相环进行自动配置,记得一定要用外部时钟源,如果使用内部时钟好像最高只能倍频到64M。下图里面的HSE就代表外部高速时钟:
然后是定时器配置:
PWM要用定时器产生才会标准,当然自然不是在定时器中断里面控制IO口这样的低级别方法。这里使用定时器1的通道1产生PWM,自动绑定的IO口是PA8:
大家可以看到定时器1配置里面的Channel1后面已经是PWM Generation CH1了。下面进行定时器分频系数和计数周期的设置。就是分别是下面两个参数:
在此以产生100HZ的方波为例,需要设置分频系数为71,计数周期为9999,为什么这样设置呢?在此给出一个公式:
(PWM频率)=(定时器挂接的时钟线频率)/[(分频系数+1)X(计数周期+1)]
对于STM32F103C8来说,定时器挂接的时钟线频率为72M(一般情况下定时器挂接的时钟线频率会等于系统时钟频率,但存在例外),上面设置了分频系数为71,计数周期为9999。因此实际产生的PWM频率为:
72000000/(72X10000)=100HZ
因此产生的PWM频率为100HZ,再比如如果我要产生200HZ的PWM,我只要设置分频系数为71,计数周期为4999就可以了。
然后在CUBEMX点击生成代码就OK啦。
然后是main函数启动PWM和进行占空比修改:
配置已经完成,但是生成的代码不会让PWM自己出现,需要人为添加代码打开PWM。打开代码如下:
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
这里我只打开了定时器1的通道1,但如果童鞋需要使用更多通道的话需要逐一打开各个通道。
然后是占空比修改,我这里设置占空比为50。代码如下:
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,5000);
可以看到这个函数有3个参数,分别是句柄htim1,定时器通道TIM_CHANNEL_1,最后一个参数5000就和占空比有关。但为什么5000就是50占空比呢?在此给出公式:
占空比(%)=100x(设置的值)/(计数周期+1)
设置的值就好比上面的5000,技术周期在我们配置CUBEMX定时器的时候已经确定了,下面代入公式进行简单运算:
占空比=100x5000/10000=50%。正确!!!
如果在此基础上我要产生占空比40%的PWM则只需设置__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,4000);就可以实现啦。
给出效果(占空比50%,对应__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,5000);):
给出效果(占空比40%,对应__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,4000);):
测试代码连接如下:https://download.csdn.net/download/weixin_44584198/18846340