• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

51单片机如何通过捕获输出pwm

第一步:首先是要配置相关的PCA寄存器  比如我们配置CCP0引脚输出PWM。

//  PCA0初始化
 
AUXR1 &= ~0x30;
 
AUXR1 |= 0x10;
 
//切换IO口, 0x00: P1.2 P1.1 P1.0 P3.7,  0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7
 
CCAPM0   = 0x42; //工作模式 PWM
 
PCA_PWM0 = (PCA_PWM0 & ~0xc0) | 0x00; //PWM宽度, 0x00: 8bit, 0x40: 7bit,  0x80: 6bit
 
CMOD  = (CMOD  & ~0xe0) | 0x08;
 
//选择时钟源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
 
CR = 1;   //开PCA计数器
 
UpdatePwm(128);

1.AUXR1 辅助寄存器

2.CCAPM0:PCA模块0的比较/捕获寄存器

B7:保留为将来之用。

ECOM0:允许比较器功能控制位。

当ECOM0 = 1时,允许比较器功能。

CAPP0: 正捕获控制位。

当CAPP0 = 1时,允许上升沿捕获。

CAPN0: 负捕获控制位。

当CAPN0 = 1时,允许下降沿捕获。

MAT0: 匹配控制位。

当MAT0 = 1时,PCA计数值与模块的比较/捕获寄存器的值的匹配将置位CCON寄存器的中断标志位CCF0。

TOG0:翻转控制位。

当TOG0 = 1时,工作在PCA高速脉冲输出模式,PCA计数器的值与模块的比较/捕获寄存器的值的匹配将使CCP0脚翻转。

PWM0: 脉宽调制模式。

当PWM0 = 1时,允许CCP0脚用作脉宽调节输出。

ECCF0:使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0,用来产生中断。

第二步:理解输出的PWM跟何值相关

一旦我们开启了PCA计数器,PCA自带的计数器CL就开始计数,Pwm的输出是跟CCAP0H有关,我们在给CCAP0H赋值的时候,当PCA自带的计数器CL溢出的时候,CCAP0L就等于了CCAP0H。

PWM的占空比就是:占空比=(256-CCAP0L)-256.

输出电压和占空比的关系就是:输出电压=占空比*最高输出电压。

(注:占空比=高电平的时间/周期)。

第三步:写出更新PWM程序

void UpdatePwm(u16 pwm_value)
 
{
 
if(pwm_value == 0) PWM0_OUT_0(); //输出连续低电平
 
else CCAP0H = (u8)(256 - pwm_value), PWM0_NORMAL();
 
}
 
注://  宏定义
 
 #define PWM0_NORMAL() PCA_PWM0 &= ~3
 
//PWM0正常输出(默认)
 
#define PWM0_OUT_0() PCA_PWM0 |=  3
 
//PWM0一直输出0 PCA_PWM0=0000 0011
 
#define PWM0_OUT_1() PCA_PWM0 &= ~3, CCAP0H = 0
 
//PWM0一直输出1

当我们的pwm_value增大的时候,CCAP0H较小,从而CCAP0L较小,从而占空比增大.

最后简单总结

PWM的原理是

通过比较CL的值跟CCAPL0的值输出波形

当CL小于CCAPL0时 输出0

当CL大于或等于CCAPL0时 输出1

PWM模式会自动运行CL并不需要手动操作

也就是说CL计数到255溢出的时候CCAPH0的值会装到CCAPL0

所以如果CCAPH0的值会不停的赋值给CCAPL0

如果CCAPH0=0的话就算CCAPL0=0x80只要CL溢出CCAPL0就被赋值0了

全部回复(6)
正序查看
倒序查看
阿飞啊
LV.6
2
2021-07-07 11:41

很实用的经验分享

0
回复
ruohan
LV.9
3
2021-07-09 08:15

是做逆变的那款宏晶的单片机吧

0
回复
鲁珀特
LV.4
4
2021-07-19 22:44

记忆力的51啥时候带输入捕捉了,莫不是新出的款式。

0
回复
GPowerBMS
LV.3
5
2021-07-20 11:49

51单片机做这个? 太累人了,用CortexM系列吧

0
回复
飞翔2004
LV.10
6
2021-07-26 22:40
@GPowerBMS
51单片机做这个?太累人了,用CortexM系列吧

CortexM功能是比较强大了,但是现在缺芯太贵了。。

0
回复
iszjt
LV.5
7
2021-08-05 11:05

51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。

0
回复