想采用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();
}
}
|