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)
|