標(biāo)題:
上位機(jī)控制步進(jìn)電機(jī)細(xì)分脈沖數(shù)不正確,keil上存在的單片機(jī)程序問題
[打印本頁]
作者:
西柚大白菜
時間:
2018-4-21 10:41
標(biāo)題:
上位機(jī)控制步進(jìn)電機(jī)細(xì)分脈沖數(shù)不正確,keil上存在的單片機(jī)程序問題
以下代碼有部分定義未用到,請大家?guī)臀铱纯礊槭裁窗凑毡壤艘詫?yīng)的細(xì)分后的單位脈沖,得到的角度不是自己設(shè)定的,也就是最終的脈沖數(shù)不正確,無法精確控制角度,是什么原因呀。
#include <reg52.h>
sbit led=P0;
//--------定義使用的IO口---------//
sbit PWM=P1^0; //脈沖輸出
sbit key_run=P1^4; //啟動
sbit led_run=P0^0; //運(yùn)行l(wèi)ed指示燈
sbit led_d=P0^3; //數(shù)據(jù)是否相同檢測
sbit led1=P0^4; //接收串口數(shù)據(jù)測試燈
//-------定義全局變量--------//
unsigned char pwm_duty=0,adc=0;
unsigned char receiveData=0;
void Turn_the_Setting_Angle(unsigned int dat);
void TimeConfig();
void delay(unsigned int c);//延時函數(shù)
void main(void)
{
TimeConfig();
led_d=0;
led1=0;
while(1)
{
if(adc==1) //P0.4口測試數(shù)據(jù)led/接收數(shù)據(jù)閃爍
{
led1=1;
adc=0;
}
Turn_the_Setting_Angle((unsigned int)(receiveData));//來自串口發(fā)來的數(shù)據(jù)
receiveData=0;
delay(1000);
led1=0;
}
}
void TimeConfig()
{
EA = 0;
//***********串口時鐘設(shè)置************//
TCLK=1;//串口設(shè)置時鐘為定時器2
RCLK=1;
TH2=0xFF; //9600bps 11.0592MHz的時鐘頻率
TL2=0xDB;
RCAP2H=0xFF; //方式1和方式3的波特率=fosc/(32*(65535-(RCAP2H,RCAP2L))
RCAP2L=0xDB;
SCON=0x50;//SM0? SM1? SM2? REN? TB8 RB8? TI RI
PCON &= 0x7F; //sMOD=0;
ET2=1;
ES=1;
EA = 1;
TR2=1;
}
//**************串口延時函數(shù)************//
void Usart() interrupt 4
{
adc=1;
receiveData=SBUF; //出去接收到的數(shù)據(jù)
if(receiveData==0x02)//判斷是否接收到相同數(shù)據(jù)
led_d=1;
else
led_d=0;
RI = 0; //清除接收中斷標(biāo)志位
SBUF=receiveData; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
}
//********************讓電機(jī)轉(zhuǎn)到設(shè)定的角度***********************//
//***************************************************************//
//dat為設(shè)定角度
void Turn_the_Setting_Angle(unsigned int dat)
{
float i=2.222,j; // 細(xì)分開關(guān)配置 800/360=2.222 200/360=0.555 1600/360=4.44 3200/360=8.888 6400/360=17.778
unsigned int Pulse_number; // Pulse_number為脈沖數(shù)
j=dat*i;
// j=dat/1.8; //200脈沖時對應(yīng)的步距角1.8,無細(xì)分
// Pulse_number= (unsigned int)(j);
Pulse_number= (unsigned int)(j*1.412); //1.412為上位機(jī)發(fā)來的16進(jìn)制數(shù)轉(zhuǎn)換為對應(yīng)比例角度
while(Pulse_number)
{
PWM=0;
delay(20);
PWM=1;
delay(20);
Pulse_number=Pulse_number-1;
}
}
void delay(unsigned int x) //延時1ms
{
unsigned int i,j;
for(i=x;i>0;i--)
{
for(j=110;j>0;j--) ;
}
}
復(fù)制代碼
作者:
西柚大白菜
時間:
2018-4-23 10:12
以上原因總結(jié)為,串口為接收到設(shè)定的角度,在接受到設(shè)定角度的情況下是可以實(shí)現(xiàn)轉(zhuǎn)動固定角度的。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1