一,pwm波理解
pwm波是由定时器产生的,我们设置定时器计数的值(记到这个数,定时器就会跳到0,重新开始数数,应该是叫自动重装值),以及一个比较寄存器ccr的值,ccr是定时器能输出pwm波的重点,输出pwm波只是定时器其中1种功能,ccr就是pwm波的特有标识了,我们知道定时器在向上计数模式下,记到重装值就变回0,而ccr的作用就是一直与定时器的当前值进行比较,当ccr值比当前值低,就输出低电平,ccr比当前定时器值高,就输出高电平,由此就能输出pwm波了,那如何改变pwm的波形呢?比如我想输出pwm波让灯泡亮一点,该怎么办?就是降低ccr的值,让他低电平的时间减少,高电平的时间变多,这就是pwm波的占空比了。
二,配置引脚
定时器可以同时产生多个pwm波,他们的频率是相同的,因为同一定时器的频率是由同一个内部定时器经过分频器产生的,但是同一个定时器可以设置多个ccr的值,以此来产生多个不同pwm波
我这里选用pa8引脚,他是定时器1的产生pwm波的第一个通道
然后配置定时器
注意打开定时器1的时钟源Clock Source,选择内部时钟,否则产生不了波。
主从模式Slave Mode与pwm没啥关系,不开
定时器1的通道1打开,设置为pwm genereation ch1
Prescler值就是分配系数了,我用的是STM32F103C8T6,一般是72mhz,经过分频值1000-1,得到定时器1的频率就是72x10的6次方除以psc值+1,也就是72000hz,定时器1的值就被设置为72000hz,我们产生的pwm波频率由定时器1输出得到,也是72000hz,
counter mode 说的是计数器的数数模式,up是向上数,此外还有向下计数,中央计数。
inter clock division下面的默认就行,然后就可以生成工程。
三,编写代码
使用cubemx通过上述操作,已经配置好了定时器,gpio输出,pwm产生通道,万事具备,只等我们去使用他了,只要两条语句我们就可以输出pwm波了,第一条,HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
使用则条函数来开始输出pwm,两个参数分别是定时器1和通道1。
第二条
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,30000);
设置上面提到的ccr的值,来改变占空比,前两个参数同上,最后一个参数就是我想设置的ccr的值了,他与我们上面设置的自动重装值相比就是占空比了。
四,得到结果
使用keil自带的示波器就可以观察到pwm波形了
内部时钟频率,通过分频器(Prescaler)分频,