全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1422
推到 Plurk!
推到 Facebook!

8052同時輸出16個PWM....

缺席
kun_tien
一般會員


發表:10
回覆:2
積分:2
註冊:2005-09-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-28 14:33:14 IP:140.121.xxx.xxx 未訂閱
使用AT89C52,要控制16顆伺服馬達,故需要16組PWM,而以下程式為同時控制8個伺服馬達的PWM訊號~~ 每顆馬達所需要的控制訊號,從(1500-800)us ~ (1500+800)us,可以另馬達從0~180度轉動,而我需造出如兩組下面的訊號:
 #include  
#define T 24055
void Delay1(void);
void Delay2(void);
void T0_int(void);
unsigned int cal_co[8]={727,164,123,123,164,204,164,1874};
unsigned char index[8]={0,1,3,2,5,4,7,6};
static unsigned char i=0; 
static unsigned int temp=0;//BCB送({最小的計數次數,次小-最小,次次小-次小...,最大-次大的計數次數})的訊號,
                           //並送計數次數陣列最少到最大的INDEX,幫助計時器溢位後令某PORT1的單BIT輸出為零
main()
{
  unsigned char j;
  TMOD=0x11;
  IE=0x82;  //EA=1,ET0=1
  temp=cal_co[0]-15-170-243;//24us
  TL0=65536-(temp);
  TH0=(65536-(temp))>>8;
  while(1)
  {
    for(j=0;j<2;j++)
    {
      P1=0xff;
      Delay1();
      P1=0x00;
      Delay2();
    }
    if(i==7)
    {
      temp=cal_co[0]-15-170-243;//24us
      TL0=65536-(temp);
      TH0=(65536-(temp))>>8;
      i=0;
    }
  }  
}
void Delay1()        
{
  TL1=65536-(cal_co[7]-15-170);
  TH1=(65536-(cal_co[7]-15-170))>>8;
  TR1=1;
  TR0=1;
  while(TF1==0);
  TF1=0;
  TR1=0;
}
void Delay2()
{
  TL1=(65536-(T-cal_co[7]-15-170));
  TH1=(65536-(T-cal_co[7]-15-170))>>8;
  TR1=1;
  while(TF1==0);
  TF1=0;
  TR1=0;
}
void T0_int(void) interrupt 1
{
  switch(index[i])
  {
    case 0: P1_0=0; break;
    case 1: P1_1=0; break;
    case 2: P1_2=0; break;
    case 3: P1_3=0; break;
    case 4: P1_4=0; break;
    case 5: P1_5=0; break;
    case 6: P1_6=0; break;  
    case 7: P1_7=0; break;
  }
  i++;
  temp=cal_co[i]-243;
  TL0=65536-(temp);
  TH0=(65536-(temp))>>8;
  if(i==7)//已經中斷TIMER0七次了
    TR0=0;
} 
kun_tien
一般會員


發表:10
回覆:2
積分:2
註冊:2005-09-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-28 14:39:58 IP:140.121.xxx.xxx 未訂閱
以上是我C51的程式,原理是利用兩個TIMER送出PWM訊號,TIMER1做出DUTY CYCLE最大的訊號,再利用TIMER0計時中斷的方式,在TIMER1還沒有計數溢位時TIMER0先溢位中斷並送給P1的某一個BIT為零,連續中斷七次,令TR0=0,停止中斷,此時而PORT1已有7個BIT為零了,最後一個BIT就是靠TIMRT1的計數溢位給定P1=0X00, 以此方式達到製造八個PWM。 而現在我遇到是TIMER0溢位中斷掉到中斷副程式時與其在中斷副程式裡面所花掉的時間太長(約有243個計數次數)而使的無法隨我程式中index[]的順序給定P1_index[]=0,可能只中斷了四次,給了四個BIT為零,TIMER1就計數溢位了,這就是我的問題了??請各位前輩我幫我看看~~是否有其他方法或是需要怎樣改進???
系統時間:2024-11-25 18:48:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!