別人的程序分享一下
電磁直立省二完整程序,預賽發揮失常,開源散經驗,僅供參考,大神勿噴。芯片K60dz,程序基于野火5.0庫,control.c:直立環、速度環、方向環的控制與整合、電機控制; tiaocan.c:按鍵調參、可設置所有PID參數、陀螺儀中值、設定速度、電感歸一化; main.c:藍牙發送數據、oled顯示電感值、干簧管停車、5次1毫秒中斷
單片機源程序如下:
- /*
- * 底層庫:基于野火5.0庫開發
- * 作者:北華航天工業學院 秋明山車神隊
- * 注意:未經作者允許,請勿用于商業,可以任意轉載,但請保留作者原創
- *
- */
- /***************************************************************/
- #include "common.h"
- #include "include.h"
- /**************************************************************/
-
- extern float Gyro_Now,g_fCarAngle;
- extern float OutData[4]; //SCI示波器參數
- extern float Gyro_Now,angle_offset_vertical; //陀螺儀轉化后的角速度,轉化后的加速度角度
- extern float g_fCarAngle,g_fGyroscopeAngleIntegral; //融合后的角度
- extern volatile int MMA7361 ,ENC03,real_angle; //加速度計AD ,陀螺儀AD,模塊輸出的角度
- extern void PIT0_IRQHandler(void);
- extern void OutPut_Data(void); //SCI采參數
- void main()
- {
- DisableInterrupts; //禁止總中斷
- LCD_Init(); //顯示屏初始化
- GYRO_VAL=flash_read(255, 0, uint16);
- GYRO2_VAL=flash_read(254, 0, uint16);
- led_Init(); //LED初始化
- adc_Init(); //ad采集初始化
- QD_Init(); //編碼器初始化
- uart_init (UART1, 115200); //藍牙初始化
- Key_Init(); //按鍵初始化
- //flash_init(); //FLASH不要初始化
- gpio_init (PTA4, GPI,0); //PTA4設置下拉
- port_init (PTA4, PULLDOWN );
- FTM_PWM_init(FTM0, FTM_CH1,10000,0);
- FTM_PWM_init(FTM0, FTM_CH2,10000,0);
- FTM_PWM_init(FTM0, FTM_CH3,10000,0);
- FTM_PWM_init(FTM0, FTM_CH4,10000,0);
- FTM_PWM_Duty(FTM0,FTM_CH1,0);
- FTM_PWM_Duty(FTM0,FTM_CH2,0);
- FTM_PWM_Duty(FTM0,FTM_CH3,0);
- FTM_PWM_Duty(FTM0,FTM_CH4,0);
- pit_init_ms(PIT0, 1); //初始化PIT0,定時時間為: 5ms
- set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler); //設置PIT0的中斷復位函數為 PIT0_IRQHandler
- enable_irq (PIT0_IRQn); //使能PIT0中斷
- DELAY_MS(1000);
- EnableInterrupts; //中斷允許
-
- while(1)
- {
- Key();
-
- /*#if 1
- OutData[0] = g_fDirectionControlOut;
- OutData[1] = g_fCarSpeednew;
- OutData[2] = g_fCarSpeedleft;
- OutData[3] = g_fCarSpeedright;*/
-
-
- /* #if 1
- OutData[0] = 1000*(AD[0]-AD[3])/(AD[0]+AD[3]);
- OutData[1] = 1000*(AD[1]-AD[2])/(AD[1]+AD[2]);
- OutData[2] = 1000*(AD[0]-AD[3]);
- OutData[3] = 1000*(AD[0]+AD[3]);
-
- OutPut_Data();
- #endif
- */
- /*
- #if 1 //直立角度
- OutData[0] = ENC03;
- OutData[1] = MMA7361;
- OutData[2] = angle_offset_vertical ;
- OutData[3] = g_fCarAngle;
- OutPut_Data();
- #endif
- */
-
- /* #if 1 //車速
- OutData[0] = g_fSpeedControlIntegral;
- OutData[1] = (g_fSpeedControlOutNew-g_fSpeedControlIntegral);
- OutData[2] = g_fCarSpeednew ;
- OutData[3] = 10*CAR_SPEED_SET;
- OutPut_Data();
- #endif
- */
-
- /*#if 1 //車速
- OutData[0] = g_fSpeedControlIntegral;
- OutData[1] = bianhualeft;
- OutData[2] = bianhuaright;
- OutData[3] = g_fCarSpeednew;
- OutPut_Data();
- #endif*/
-
-
- if(Star_flag==0&&g_nInterrupt_Count==2)
- {
- LCD_Fill(0x00); //初始清屏
- LCD_PrintU16(0,0,AD_average[0]);
- LCD_PrintU16(32,0,AD_average[1]);
- LCD_PrintU16(64,0,AD_average[2]);
- LCD_PrintU16(96,0,AD_average[3]);
- LCD_PrintU16(0,2,AD[0]);
- LCD_PrintU16(32,2,AD[1]);
- LCD_PrintU16(64,2,AD[2]);
- LCD_PrintU16(96,2,AD[3]);
- LCD_PrintFloat(50,4,g_fCarAngle);
- }
- }
- }
- /**********************中斷服務程序*******************/
- void PIT0_IRQHandler(void)
- {
- DisableInterrupts;
- if(jishu>=8000) //干簧管檢測延時
- {
- jishu=8000;
- led(LED5,LED_ON);
- if(key_check(KEY_STOP) == KEY_DOWN) //干簧管停車
- {
- KEY_START_flag=0; //調參界面復位
- Star_flag=50; //電機停轉
- led(LED4,LED_ON);
- }
- }
-
- if(KEY_START_flag>=5) //調參界面5開始中斷計數,干簧管延時
- {jishu++;
- }
-
- g_nInterrupt_Count++; //一堆計數
- g_nSpeedControlPeriod++;
- SpeedControlOutput(); //一堆平滑輸出
- g_nDirectionControlPeriod++;
- DirectionControlOutput() ;
-
- if(g_nInterrupt_Count>=5) //三個環控制
- {
- GetMotorPulse();
- g_nInterrupt_Count=0;
- }
- else
- if(g_nInterrupt_Count==1)
- {
- Get_AD_data();
- Rd_Ad_Value();
- }
- else
- if(g_nInterrupt_Count==2)
- {
- AngleCalculate();
- AngleControl(g_fCarAngle,Gyro_Now);
- MotorOutput();
- led_turn (LED1);
- }
- else
- if(g_nInterrupt_Count==3)
- {
- g_nSpeedControlCount++;
- if(g_nSpeedControlCount>=20)
- {
- led_turn (LED2);
- SpeedControl();
- g_nSpeedControlCount=0;
- g_nSpeedControlPeriod=0;
- }
- }
- else
- if(g_nInterrupt_Count==4)
- {
- g_nDirectionControlCount++;
- DirectionVoltageSigma();
- if(g_nDirectionControlCount>=2)
- {
- DirectionControl();
- g_nDirectionControlCount=0;
- g_nDirectionControlPeriod=0;
- }
-
- }
- PIT_Flag_Clear(PIT0); //清中斷標志位
- EnableInterrupts;
- }
復制代碼
所有資料51hei提供下載:
smart_car-16.7.20.7z
(785.66 KB, 下載次數: 88)
2019-3-5 03:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|