以下代碼有部分定義未用到,請大家幫我看看為什么按照比例乘以對應的細分后的單位脈沖,得到的角度不是自己設定的,也就是最終的脈沖數不正確,無法精確控制角度,是什么原因呀。
- #include <reg52.h>
- sbit led=P0;
- //--------定義使用的IO口---------//
- sbit PWM=P1^0; //脈沖輸出
- sbit key_run=P1^4; //啟動
- sbit led_run=P0^0; //運行led指示燈
- sbit led_d=P0^3; //數據是否相同檢測
- sbit led1=P0^4; //接收串口數據測試燈
- //-------定義全局變量--------//
- 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);//延時函數
- void main(void)
- {
- TimeConfig();
- led_d=0;
- led1=0;
- while(1)
- {
-
- if(adc==1) //P0.4口測試數據led/接收數據閃爍
- {
- led1=1;
- adc=0;
- }
- Turn_the_Setting_Angle((unsigned int)(receiveData));//來自串口發來的數據
- receiveData=0;
- delay(1000);
- led1=0;
- }
- }
- void TimeConfig()
- {
- EA = 0;
- //***********串口時鐘設置************//
- TCLK=1;//串口設置時鐘為定時器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;
- }
- //**************串口延時函數************//
- void Usart() interrupt 4
- {
- adc=1;
- receiveData=SBUF; //出去接收到的數據
- if(receiveData==0x02)//判斷是否接收到相同數據
- led_d=1;
- else
- led_d=0;
- RI = 0; //清除接收中斷標志位
- SBUF=receiveData; //將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- }
- //********************讓電機轉到設定的角度***********************//
- //***************************************************************//
- //dat為設定角度
- void Turn_the_Setting_Angle(unsigned int dat)
- {
- float i=2.222,j; // 細分開關配置 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為脈沖數
- j=dat*i;
- // j=dat/1.8; //200脈沖時對應的步距角1.8,無細分
- // Pulse_number= (unsigned int)(j);
- Pulse_number= (unsigned int)(j*1.412); //1.412為上位機發來的16進制數轉換為對應比例角度
- 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--) ;
- }
- }
復制代碼
|