STC PCA应用舵机驱动、

2019-04-14 20:42发布

STC12C5A60S2 PCA相关寄存器介绍

STC12C5A60S2有两个PCA模块共用一个16位计数器(对应2个寄存器低8位CL和高8位CH),两个模块有各自的16位捕捉/比较器(对应2个寄存器低8位CCAPnL和高8位CCAPnH)。计数器的技术源可以是1/8系统时钟、1/2系统时钟、定时器0溢出或ECI脚输入。
STC12C5A60S2 PCA相关寄存器

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位
STC12C5A60S2 PCA 计数源设置寄存器
22.1184dMHZ的晶振下STC12C5A60S2的定时器初始化函数为: void Timer0Init(void){ //78微秒@22.1184MHz,8位自动重载模式 ET0 = 1; AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x02; //设置定时器模式 TL0 = 0x70; //设置定时初值 TH0 = 0x70; //设置定时重载值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } 注意:PCA用定时器做时钟源0的时候只需要定时器的溢出就行,并不需要开始中断,而且事实上,定时器0的中断还能再用。
通过控制信号PWM中高电平的脉宽来控制舵机的角度,脉宽从5ms到15ms分别对应舵机的角度范围的上下限。详细的舵机控制原理请戳舵机的原理和控制-新浪微博 50HZ的PWM高电平20ms一共被分成256份,取到5ms-15ms的只有26份,也就是说8位PWM驱动舵机只能产出25个档位。现在要做的就是确定比较器值和舵机角度的对应关系,舵机电路的误差为是这个值的范围有一定的偏移。
一下为初始化PWM并驱动舵机到某一角度的函数 CMOD = 0x84; //1000,0100,PCA脉冲时钟源为定时器0 CCAP1H = CCAP1L = 0xec;//设置比较器和比较器重载寄存器的值 CCAPM1 = 0x42;//0100,0010//b6 CR = 1;//开启PCA