在论坛发了好几个求问帖,一直受到原子大哥的帮助。。心生惭愧。总想什么时候自己能回报一下论坛。
只怪自己还是一个学生,能力大大滴有限。久久不能发个有用的帖子。
这两天一直在搞定时器的PWM比较输出,看了很多资料,把论坛里有关的帖子也看了一遍。
发现原子大哥已经在多个帖子讲解了PWM输出,辛苦啊。
下面是本人结合原子大哥的讲解和个人感悟得出的一些结论和实验代码,必然有许多不足之处(极有可能有错),还望原子大哥和各位大虾谅解,可以随意批评指正我(本人脸皮实测较厚)。
第一步:TIMx_CNT和TIMx_CCR1比较,来分配无效电平和有效电平的占空比
第二步:OC1REF就是存储无效电平和有效电平的占空比
第三步:CC1P决定有效电平是高电平or低电平,无论CC1P取什么,最终输出的均为有效电平
总结:我们所要做的
1.控制有效电平占空比
2.控制输出高or低
验证代码(修改于原子哥的代码)
#include <stm32f10x.h>
#include "sys.h"
#include "delay.h"
#include "io.h"
#include "timer.h"
/*==================================================================================================*/
//验证CC1P的作用~
//观察LED的亮暗判断:高亮->微亮->高亮->微亮->灭->微亮->灭->微亮
//亦可仿真观察PA0的输出波形
//设置CC1P,O:高电平有效,1:低电平有效,控制输出OC1REF有效电平的极性
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置,外部高速时钟HSE,9倍频
Delay_Init(72); //延时初始化,设置在系统时钟下,必须始终初始化一致
IO_Init(); //初始化IO接口
Timer2_PWM1_Init(900,0); //不分频。PWM频率=72000/900=80Khz,周期=12.5us
while(1)//死循环
{
TIM2->CCER|=1<<1; //低电平为有效电平
LED0_PWM_VAL=0; //OC1REF电平,一直有效电平
Delay_Ms(1000);
LED0_PWM_VAL=850; //OC1REF电平,无效电平:0-850,有效电平:851-900
Delay_Ms(1000);
LED0_PWM_VAL=0;
Delay_Ms(1000);
LED0_PWM_VAL=850;
Delay_Ms(1000);
TIM2->CCER&=~(1<<1); //高电平为有效电平
LED0_PWM_VAL=0; //OC1REF电平,一直有效电平
Delay_Ms(1000);
LED0_PWM_VAL=50; //OC1REF电平,无效电平:0-50,有效电平:51-900
Delay_Ms(1000);
LED0_PWM_VAL=0;
Delay_Ms(1000);
LED0_PWM_VAL=50;
Delay_Ms(1000);
}
}
原子大哥的详细讲解:
http://http://www.openedv.com/posts/list/140.htm
另一个比较有帮助的帖子:
http://http://www.openedv.com/posts/list/374.htm |