想采用STC15W408AS的 PCA/PWM来驱动步进电机
PCA的时钟源采用定时器的溢出率作为PCA的时钟源
目前,输出频率以及PWM都正常,唯独就是有一个地方出现了问题,请版主或者各位看下,哪里出了问题
首先看代码:
#include<STC15F2K60S2.H> //24MHZ
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i=2;
uint num,x,y;
bit fig=0;
void pwminit() //初始化PWM模块与系统
{
AUXR=0x80; //定时器时钟频率为1T模式
TMOD=0X02; //定时器为8位自动重装 模式
TH0=160; //初值设定 定时器溢出率为 256-TH0/TL0的值
TL0=160; //初值设定 定时器0溢出频率为24000000/(256-160)=250000Hz
CMOD=0X84; //PCA模块空闲模式停止计数,设置采用定时器0的溢出率作为PCA模块的时钟源 时钟源=F/(256-定时器初值)/256
//那么PCA的频率应该等于250000/256=976 HZ
CCON=0; //PCA计数器启动控制寄存器
CL=250; //PCA模块初值
CH=250; //PCA模块初值 5个脉冲就PCA计数器溢出
CCAPM0=0X42; //PCA模块允许比较, PCA作为PWM输出功能使用
CCAP0H=127; //PWM占空比设定
CCAPM1=0X42; //PWM2
CCAP1H=127; //PW2
EA=1; //总中断开关打开
TR0=1; //启动定时器0
CR=1; //启动PCA计数器
}
void time0() //脉冲定数记录子函数,记录脉冲个数,用来决定步进电机的行程
{
if(CF==1) //问题就处在这个子函数上面 这里是判断PCA是否记满数量 溢出标志位,如果是 那么说明5个脉冲满了,NUM+1, 如果我NUM为10
{ //那么应该是50个脉冲,而实际就不止50个脉冲了
CF=0;
num++;
if(num==10) //上面PCA的计数器初值是250 到了5个脉冲就会溢出一次,而我这里NUM==1的时候,我测试过,确实是5个脉冲就停掉了
//示波器上面看过了,NUM=1 就是5个脉冲 一但NUM不是为1的时候脉冲就不对
{ //但是如果我这里写NUM==10 出来的脉冲数量就不对了,估计都有上千的脉冲数量,大家看出来是哪里出了问题吗
num=0;
CR=0;
}
}
}
void main() //主函数入口
{
pwminit();
while(1)
{
time0();
}
}
|