2013電子設計競賽控制類題目
單片機源程序如下:
- #include "sys.h"
- int flag=0,key=0;
- int Bias=0; //本次偏差
- int Last_Bias=0; //上一次偏差
- int angel,G0=0; //擺桿角度
- int Encoderdata; //電機速度
- //float Encoder_Least,Encoder=0;
- //float Encoder_Integral;
- int pwm; //pwm輸出量
- int main(void)
- {
- int i;
- delay_init(); //延時初始化
- uart_init(115200); //串口初始化為
- LED_Init(); //初始化與LED連接的硬件接口
- Balance_Motor_Init(); //電機控制端口初始化
- KEY_Init(); //按鍵端口初始化
- LCDx_Init(); //初始化LCD
- Adc_Init(); //ADC初始化
- TIM2_Base_Init(50); //10Khz的計數頻率,計數到50為5ms
- TIM4_PWM_Init(999,6); //72000000/(6*1000)=12Khz
- Encoder_Init(); //TIM3 PA6 PA7
- delay_ms(200); //=====延時等待穩定
- POINT_COLOR=BLUE;
- LCD_ShowString(60,110,200,16,16,"Encoder VAL:");
- LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");
- LCD_ShowString(100,190,200,16,16,"Press Key_x");
- while(1)
- {
- LED2_REV;
- delay_ms(100);
- //angel=Get_Adc(ADC_Channel_1);
- //Read_Encoder();
- //LCD_ShowxNum(156,130,angel,4,16,0);
- //LCD_ShowxNum(156,110,Encoderdata,4,16,0);
- key=KEY_Scan(0);
- if(key)
- {
- switch(key)
- {
- case WKUP_PRES: flag=4;break; //完成基本要求3和抗干擾
- case KEY2_PRES: flag=3;break; //完成保持倒立旋轉臂圓周
- case KEY1_PRES: flag=2;break; //完成自起擺
- case KEY0_PRES: flag=1;break; //完成基本要求1、2
- }
- }
-
- if(flag==1) //按鍵1
- {
- for(i=0;i<3;i++)
- {
- Zheng(650);
- delay_ms(400);
- Fan(650);
- delay_ms(400);}
- for(i=0;i<2;i++)
- {Zheng(800);
- delay_ms(200);
- Fan(800);
- delay_ms(200);}
- stop();
- flag=0;
- }
- if(flag==2) //按鍵2
- {
- Zheng(700);
- delay_ms(400);
- Fan(650);
- delay_ms(400);
- Zheng(950);
- delay_ms(300);
- Fan(950);
- delay_ms(200);
- stop();
- flag=4; //進入PID調節
- }
- if(flag==3) //按鍵3
- {
- G0=30;
- flag=4; // 進入PID調節
- }
- }
- }
- void TIM2_IRQHandler(void) //TIM2中斷
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷
- Read_Encoder();
- LCD_ShowxNum(156,110,Encoderdata,4,16,0);
- //LED2_REV;
- if(flag==4)
- {
- angel=Get_Adc(ADC_Channel_1)+G0; //更新擺桿狀態
-
- Bias=angel-3210; //本次偏差=adc值-平衡中值
- pwm=26.0*Bias+8.0*(Bias-Last_Bias); //PD控制器
- if(pwm > 0) //26 16
- {
- if(pwm>=1000)
- {
- pwm=1000;
- }
- Fan(pwm); //控制電機反轉 逆時針
- }
- else
- {
- if(pwm<=-1000) //限制幅度
- {
- pwm=-1000;
- }
- pwm=-pwm;
- Zheng(pwm); //控制電機正轉 順時針
- }Last_Bias=Bias;
- }
- }
- }
- //encoder=Read_Encoder();
- // Encoder_Least =encoder-0; //===獲取最新速度偏差==測量速度-目標速度(此處為零)
- // Encoder *= 0.7; //===一階低通濾波器
- // Encoder += Encoder_Least*0.3; //===一階低通濾波器
- // Encoder_Integral +=Encoder; //===積分出位移 積分時間:5ms
- // if(Encoder_Integral>500) Encoder_Integral=500; //===積分限幅
- // if(Encoder_Integral<-500) Encoder_Integral=-500;
復制代碼
所有資料51hei提供下載:
簡易倒立擺 最終版 - 副本.rar
(405.51 KB, 下載次數: 71)
2018-6-26 19:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|