- /*此系統如果不控制正反轉引腳,那么一上電運轉與程序無關,因為PWM引腳一上
- 電就為高電位*/
- #include "IAP15W4K61S4.h"
- #include "Adc_config.h"
- #include "delay_m.h"
- //#include "serial_xj.h"
- #include "pwm_contr.h"
- #include "stdio.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar one_adc_value=0xff, two_adc_value=0xff; //兩路ADC值
- sbit FFW=P3^5; //方向控制位
- uchar L_Speed=0, R_Speed=0, temp1=0, temp2=0; //左右兩路速度
- uint value1=0;
- bit L_R_Flag=0;
- void main()
- {
- //Serial1_Init(); //串口通信初使化
- ADC_RES=0; //ADC轉換寄存器
- Adc_Init(); //ADC初使化
- //Adc_Change(5); //啟動P1.5進行AD轉換
- P1M0=0x03;
- P1M1=0x00; //設置成強推挽輸出
- mDelay(10000); //延時一段時間待電源穩定。
- pwm_Init(); //PWM初使化
- IE=0xa0; //開總中斷,允許ADC中斷執行
- while(1)
- {
- Adc_Change(5); //測量第五路ADC
- mDelay(100);
- Adc_Change(6); //測量第六路ADC
- mDelay(100);
- if(one_adc_value<118) //如果后退
- {
- L_R_Flag=1; //需要判斷左右轉向
- temp1=118-one_adc_value;
- temp1<<=1;
- }
- else if(one_adc_value>138) //前進
- {
- L_R_Flag=1; //需要判斷左右轉向
- temp1=one_adc_value-138;
- temp1<<=1;
- }
- else
- {
- FFW=1; //方向為前進
- L_Speed=0xff;
- R_Speed=0xff;
- }
- if(L_R_Flag) //如果有速度
- {
- L_R_Flag=0; //清除左右轉標志位
- if(two_adc_value<118)
- {
- temp2=118-two_adc_value;
- value1=(((temp1*100)/118)*temp2)/100;
- temp2=(unsigned char)value1;
- R_Speed=0xff-temp1+temp2;
- L_Speed=0xff-temp1;
- }
- else if(two_adc_value>138)
- {
- temp2=two_adc_value-138;
- value1=(((temp1*100)/118)*temp2)/100;
- temp2=(unsigned char)value1;
- L_Speed=0xff-temp1+temp2;
- R_Speed=0xff-temp1;
- }
- else
- {
- L_Speed=0xff-temp1;
- R_Speed=0xff-temp1;
- }
- }
- pwm_Change(L_Speed, R_Speed); //ADC值轉頻率
- //Send_data(0x55);
- }
- }
- /*ADC中斷只起一個發送串行數據的功*/
- /*中斷函數不需要聲明*/
- void adc_inter() interrupt 5
- {
- static Count=0;
- ADC_CONTR &=!ADC_FLAG;
- if(Count==0)
- {
- Count=1;
- one_adc_value=ADC_RES;
- }
- else
- {
- Count=0;
- two_adc_value=ADC_RES;
- }
- }
復制代碼
|