⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duoji_example.c

📁 c8051f单片机控制舵机程序
💻 C
字号:
我采用F330的PCA产生PWM波来控制舵机,原来书上提供的程序是F040的,我把初始化部分改了,想得到20ms周期的方波,高电压持续时间为0.5-2.5ms,让舵机正转后又反转,可是在示波器上看不到期望的波形,程序如下:

#include <C8051F330.h>
#define CEX0PORT p07//舵机控制信号管脚,为P0.7管脚
//系统时钟为24500KHZ/8=3062.5KHZ
//周期为20ms,则频率为50HZ,则tmph+tmpl=61250可以保证产生50HZ PWM
#define CONST_W 61250
#define FORMAT_ANG temp=6125L*angval;temp/=180;tmph=(uint)temp+1531;tmpl=(uint)CONST_W-tmph
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;

sfr PCA0CP0=0xfb;

sbit p07=P0^7;


//sbit p06=P0^6;
bit iscex0H;
xdata uint cex0L,cex0H;
xdata uint tmph,tmpl;
ulong temp;
int xdata angval;//1800表示180度,使得精度为0.1度
 //转化计算:tmph=6125*angval/180+1531,但是由于计算时超过65535就会溢出
 //,所以不能直接这样计算,可定义ulong型变量temp,
 //temp=6125L*angval;
//文件尾:

void delay1ms(uint time){

 uint i;
 uint j;
//EIE2&=0XFD;//EADC0=0;

 for(i=0;i<time;i++){
    for(j=0;j<300;j++);
 }
 //EIE2|=0X02F;//EADC0=1;
      }

void pca0ini(){
 
PCA0CPM0=0x4d;//高速输出模式
 }
 
 void CEX0_out(uint h,uint l){
cex0L=l;
cex0H=h;
CEX0PORT=1;
iscex0H=1;
}

void CEX0_set(uint pram){

PCA0CP0+=pram;
PCA0CPM0|=0x40;
}

void pcaini(){

PCA0MD=0x09;  //系统频,禁看门狗,允许溢出中断
PCA0CN=0x40;  // 开时钟
EIE1|=0X10;  // 开中断
//EIP1|=0X80;
}

void config(){

 
XBR0=0x00;          //不连接
XBR1=0x40;         //使能
P0MDOUT=0x00;              
P1MDIN=0xff;
CLKSEL=0x00;  //内部时钟
OSCXCN=0x00;
OSCICN=0x80; //8分频

              }

void main(void){

 config();


 pca0ini();


 pcaini();


 CEX0PORT=0;//将控制信号输出置0
 //0度对应:tmph=1531,tmpl=CONST_W-tmph
 //180度对应:tmph=7656,tmpl=CONST_W-tmph,
 angval=0;
 FORMAT_ANG;//计算出tmph和tmpl的值
 EA=1;
 CEX0_out(tmph,tmpl);
 delay1ms(1000);
 while(1){

    //angval=90;
// FORMAT_ANG;
// CEX0_out(tmph,tmpl);
  // delay1ms(20);

 for(angval=0;angval<=180;angval+=30){//每隔2秒正转30度
  FORMAT_ANG;
     CEX0_out(tmph,tmpl);
  delay1ms(2000);
  }


  for(angval=180;angval>=0;angval-=30){//每隔2秒反转30度
  /*注意angval不能定义成uint型,否则angval>=0条件恒真*/
  FORMAT_ANG;
  CEX0_out(tmph,tmpl);
    delay1ms(2000);


     }


    


  }


 

}


void PCA_ISR(void) interrupt 11{


 if(CF){


  CF=0;


 }


 if(CCF0){
  if(iscex0H){
   CEX0_set(cex0L);//隔cex0L个PCA时钟后发生中断,则低电平持续时间为
   //cex0L个PCA时钟
   iscex0H=0;


   }


  else{         
   CEX0_set(cex0H);//隔cex0H个PCA时钟后发生中断,则高电平持续时间为
   //cex0H个PCA时钟
   iscex0H=1;

         }
  CEX0PORT=iscex0H;
  CCF0=0;

 }

}
请指教!谢谢!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -