STC12C5A60S2 PCA相关寄存器介绍
STC12C5A60S2有两个PCA模块共用一个16位计数器(对应2个寄存器低8位CL和高8位CH),两个模块有各自的16位捕捉/比较器(对应2个寄存器低8位CCAPnL和高8位CCAPnH)。计数器的技术源可以是1/8系统时钟、1/2系统时钟、定时器0溢出或ECI脚输入。
STC12C5A60S2 PWM驱动舵机
PCA做PWM时计数器是8位的,16位的计数器和比较器只用到低8位(比较器的高八位也用到,下面会讲到),硬件将计数器的值和捕捉/比较寄存器比较,匹配时将改变PWM引脚电平。以PWM0为例,计数器为CL,比较器为CCAP0L
计数器CL中的值
< 比较器CCAP0L中的值是,相应的引脚输出
低电平;
计数器CL中的值
>=比较器CCAP0L中的值是,相应的引脚输出
高电平。
当计数器CL的值从0xFF到0X00溢出是,比较器的高八位CCPA0H的值将载入CCPA0L,这样就实现了无干扰的更新PWM。
因为舵机的驱动信号要50HZ,所以PCA计数器时钟频率应该是1/(50*256)=78us,不可能改变单片机的晶振频率,所以只能用定时器0的溢出做计数源,对计数源的设置在PCA模式寄存器CMOD的B3-B2位
22.1184dMHZ的晶振下STC12C5A60S2的定时器初始化函数为:
void Timer0Init(void){
ET0 = 1;
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x02;
TL0 = 0x70;
TH0 = 0x70;
TF0 = 0;
TR0 = 1;
}
注意:PCA用定时器做时钟源0的时候只需要定时器的溢出就行,并不需要开始中断,而且事实上,定时器0的中断还能再用。
通过控制信号PWM中高电平的脉宽来控制舵机的角度,脉宽从5ms到15ms分别对应舵机的角度范围的上下限。详细的舵机控制原理请戳
舵机的原理和控制-新浪微博 50HZ的PWM高电平20ms一共被分成256份,取到5ms-15ms的只有26份,也就是说8位PWM驱动舵机只能产出25个档位。现在要做的就是确定比较器值和舵机角度的对应关系,舵机电路的误差为是这个值的范围有一定的偏移。
一下为初始化PWM并驱动舵机到某一角度的函数
CMOD = 0x84;
CCAP1H = CCAP1L = 0xec
CCAPM1 = 0x42
CR = 1