小白程序,需要的可以拿走
单片机源程序如下:
- #include "common.h"
- #include "include.h"
- #include "control.h"
- extern float OutData[4];
- extern float Gyro_Now, angle_offset_vertical; //陀螺仪转化后的角速度,转化后的加速度角度
- extern float g_fCarAngle, g_fGyroscopeAngleIntegral; //融合后的角度
- extern volatile float MMA7361 , ENC03, MMA7361_X; //加速度计AD ,陀螺仪AD
- extern float left_count, right_count, Speed_count;
- extern float Speed_L_Last, Speed_R_Last;
- extern float newspeed_PWM[2], Speed_PWM[2];
- extern float AD[4];
- extern float AD_sum[4];
- extern float AD_min[4];
- extern float AD_max[4];
- extern int AD_norvalue[4];
- extern uint8 dire_flag, bal_flag; //stop_flag = 0;
- extern float speed_flag;
- uint8 systick_flag = 1, dire_timeflag = 1;
- //char ch;
- extern struct PID sptr; //速度
- extern struct PID dire; //转向
- extern void PIT0_IRQHandler(void);
- extern void OutPut_Data(void);
- void All_Init();
- void Speed_PID_Init();
- void main()
- {
- DisableInterrupts;
- gpio_init(PTG0,GPO,1);
- gpio_init(PTG1,GPO,1);
- gpio_init(PTG2,GPO,1);
- gpio_init(PTG3,GPO,1);
- key_init(KEY_A);
- All_Init();
- DELAY_MS(2000);
- EnableInterrupts;
- ftm_pulse_clean(FTM0);
- ftm_pulse_clean(FTM1);
- while(1)
- {
- // led_turn(LED0);
- // led_turn(LED0);
- if(dire_timeflag == 5)
- {
- dire_timeflag = 1;
- get_elec();
- elec_handle();
- }
- else
- {
- dire_timeflag++;
- get_elec();
- }
- // if(stop_flag == 1)
- // {
- // irq_init (IRQ_PIN, IRQ_PULLUP_EN | IRQ_FALLING) ; //配置为下降沿中断
- // enable_irq(IRQ_IRQn);
- // }
- }
- }
- void All_Init()
- {
- led_init(LED3);
- led_init(LED2);
- led_init(LED0);
- led_init(LED1);
- uart_init(UART0,115200);
- gpio_init(PTD6,GPO,1); //陀螺仪SEL
- PTD6_OUT = 1;
- adc_init(ADC0_SE2); //ZOUT_Z
- adc_init(ADC0_SE3); //Gyro1
- adc_init(ADC0_SE7); //L1
- adc_init(ADC0_SE5); //L2
- adc_init(ADC0_SE11); //L5
- adc_init(ADC0_SE10); //L6
- //在 port_cfg.h 中修改精度
- ftm_pwm_init(FTM2, FTM_CH3,40000,1000);
- ftm_pwm_init(FTM2, FTM_CH2,40000,1000);
- ftm_pwm_init(FTM2, FTM_CH0,40000,1000);
- ftm_pwm_init(FTM2, FTM_CH1,40000,1000);
- gpio_init(PTG4,GPO,1);
- gpio_init(PTD4,GPO,1);
- gpio_init(PTD2,GPO,1);
- gpio_init(PTF1,GPO,1);
- ftm_pulse_init(FTM0, FTM_PS_1, TCLK1); //PTE0 encoder
- ftm_pulse_init(FTM1, FTM_PS_1, TCLK2); //PTE7
- gpio_init(PTE5,GPI,0); //left
- gpio_init(PTB5,GPI,0); //right
-
- pit_init_ms(PIT0, 5);
- enable_irq(PIT_CH0_IRQn);
- systick_timing_ms(10);
- Speed_PID_Init();
- }
- void Speed_PID_Init(void)
- {
- sptr.SetPoint = 25;
- sptr.Proportion = 5;
- sptr.Integral = 0.025;
- sptr.Derivative = 0;//0.18;
- sptr.now_Error[0] = 0; //Error[0]
- sptr.now_Error[1] = 0;
- sptr.Last_Error[0] = 0; //Error[-1]
- sptr.Last_Error[1] = 0;
- sptr.Prev_Error[0] = 0; //Error[-2]
- sptr.Prev_Error[1] = 0;
- dire.SetPoint = 100;
- dire.Proportion = 4.5; //0.02 ;
- dire.Integral = 0.001;//0.032; //0.00015
- dire.Derivative = 0.00;//0.002;
- dire.now_Error[0] = 0;
- dire.now_Error[1] = 0;
- dire.Last_Error[0] = 0;
- dire.Last_Error[1] = 0;
- dire.Prev_Error[0] = 0;
- dire.Prev_Error[1] = 0;
- }
- void pit_ch0_irq(void)
- {
- led_turn(LED3);
- AD_Calculate();
- if(systick_flag%2 == 0)
- get_speed();
- if(systick_flag == 20)
- {
- //get_speed();
- run_speed();
- systick_flag = 1;
- }
- systick_flag++;
- Speed_Calculate(g_fCarAngle,Gyro_Now);
- PIT_Flag_Clear(PIT0);
- }
- //
- //void irq_irq(void)
- //{
- // while(IS_IRQ_FLAG())
- // {
- // ftm_pwm_duty(FTM2,FTM_CH2,0);
- // ftm_pwm_duty(FTM2,FTM_CH3,0);
- // ftm_pwm_duty(FTM2,FTM_CH1,0);
- // ftm_pwm_duty(FTM2,FTM_CH0,0);
- // gpio_set(PTG0,0);
- // gpio_set(PTG1,0);
- // gpio_set(PTG2,0);
- // gpio_set(PTG3,0);
- // }
- // IRQ_CLEAN_FLAG() ;
- //}
- //void systick_irq(void)
- //{
- // static int i=0;
- // if(i==100000)
- // {
- // stop_flag = 1;
- // i=0;
- // }
- // else
- // {
- // i++;
- // stop_flag = 0;
- // }
- //}
复制代码
所有资料51hei提供下载:
V7.10.0.rar
(161.05 KB, 下载次数: 57)
|