各位大神,小弟想用单轴摇杆(0-5V模拟量输出)控制步进电机的方向和转速,请问如何实现,以下是我的程序,但用Proteus仿真发现: 1.脉冲的输出和摇杆的变化不对应。 2.脉冲波形中间会规律的出现一段较长时间的低电平或高电平。 希望各位大神指点!感谢! #include<reg52.h> #define uchar unsigned char #define uint unsigned int /*ADC0809将摇杆模拟信号转换为数字信号*/ sbit ST=P0^0; //P0为ADC0809信号控制口 sbit EOC=P0^1; sbit OE=P0^2; sbit CLK=P0^3; sbit shineng=P2^0; // 步进电机驱动 sbit fangxiang=P2^1; sbit zhuan=P2^2; uchar num; uchar pwm; //控制脉冲频率 uchar u_cai; //信号采集 void timestart() //ADC0809模块初始化 { TMOD=0x01; TH1=(65536-1)/256; TL1=(65536-1)%256; TH0=(65536-10000)/256; TL0=(65536-10000)%256;
ET0=1; EA=1; ET1=1; TR1=1;
}
void delay(uint xms) //延时函数 { uinti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); }
void jisuan(uchar u_cai) //通过采集的模拟信号计算脉冲周期 { if(u_cai<=125) { fangxiang=1; pwm=u_cai+1; } elseif((u_cai>125)&&(u_cai<=135)) { pwm=255; shineng=0; } else { fangxiang=0; pwm=-1*(u_cai-129)+126; } }
} void caishu() //ADC0809信号采集程序 {
ST=0; ST=1; ST=0; OE=1; delay(8); u_cai=P1; OE=0;
}
void main() { timestart(); shineng=1;
while(1) { num=0; caishu(); jisuan(u_cai); TR0=1; }
}
void time1() interrupt 3 { TH1=(65536-1)/256; TL1=(65536-1)%256; CLK=~CLK; }
void time0() interrupt 1 { TH0=(65536-100)/256; TL0=(65536-100)%256;
num++; if(num==pwm) { num=0; zhuan=~zhuan;
} }
|