📄 duoji_example.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 + -