keaz1284 可跑程序
单片机源程序如下:
- #include "headfile.h"
- int flag;
- void Para_Init()
- {
- PID_ANGLE.P=0.10;
- PID_ANGLE.D=0.001;
- PID_SPEED.P=1.5;
- PID_SPEED.I=0.05;
- PID_TURN.P=0.01;
- PID_TURN.D=0.005;
- Fuzzy_Kp=0.005;
- Fuzzy_Kd=0.0005;
- SetSpeed=2.5;
- Set_Angle=20;
-
-
- Control_Para[0]=SetSpeed;
- Control_Para[1]=PID_ANGLE.P;
- Control_Para[2]= PID_ANGLE.D;
- Control_Para[3]= PID_SPEED.P;
- Control_Para[4]= PID_SPEED.I;
- Control_Para[5]= PID_TURN.P;
- Control_Para[6]= PID_TURN.D;
- }
- void main(void)
- {
- DisableInterrupts ;
-
- ADC_Init(ADC_CHANNEL_AD4,ADC_12BIT); //电磁采集0
- ADC_Init(ADC_CHANNEL_AD5,ADC_12BIT); //电磁采集1
- ADC_Init(ADC_CHANNEL_AD2,ADC_12BIT); //电磁采集2
- ADC_Init(ADC_CHANNEL_AD3,ADC_12BIT); //电磁采集3
- ADC_Init(ADC_CHANNEL_AD6,ADC_12BIT); //电磁采集4
- ADC_Init(ADC_CHANNEL_AD7,ADC_12BIT); //电磁采集5
- ADC_Init(ADC_CHANNEL_AD10,ADC_12BIT); //电池电压采集实验
-
- button_init(); //按键初始化
- switch_init(); //拨码开关初始化
- FTM_PWM_init(CFTM2, FTM_CH5, 20000, 0); //PWM0 PTG7 电机驱动
- FTM_PWM_init(CFTM2, FTM_CH4, 20000, 0); //PWM1 PTG6 电机驱动
-
- FTM_PWM_init(CFTM2, FTM_CH3, 20000, 0); //PWM2 PTG5 电机驱动
- FTM_PWM_init(CFTM2, FTM_CH2, 20000, 0); //PWM3 PTG4 电机驱动
-
- PULSE_INIT(CFTM0); //编码器1采集
- PULSE_INIT(CFTM1); //编码器1采集
-
- uart_init(UARTR1,1500000); //wifi模块传输初始化
-
- BEEP_ON;
- OLED_Init(); //OLED 初始化
- OLED_Draw_Logo(); //画logo专用函数
- delay(300);
- OLED_Fill(0); //初始清屏
- BEEP_OFF;
- I2C_Init(); //初始化加速度陀螺仪传感器
- PIT_Init(PIT_CHANNEL0,2*BUS_CLK_KHZ); //定时中断 2ms 初始化
- EnableInterrupts;
- Para_Init();
- led_init();
- water_lights();
- while(1)
- {
- if(beep)
- {
- BEEP_ON;
- delay(50);
- BEEP_OFF;
- beep=0;
- }
- Read_Switch();
- Check_BottonPress();
- if(SendPara)
- {
- SendPara=0;
- Send_Parameter();
- }
-
- if(flag) //此段不超过0.5ms 200ms主频 6ms 或8ms 执行一次
- {
- flag=0;
-
- Send_Begin();
- Variable_update();
- Send_Variable();
- Send_Inductor();
- }
- if(OLED_Refresh)
- {
- OLED_Draw_UI();
- }
- }
- }
- //定时器0中断函数
- void PIT0_ISR(void)
- {
- static uint8 flag_100ms,cnt=0;
- RunTime=RunTime+0.002;
- flag_100ms++;
- if(flag_100ms>50)
- {
- flag_100ms=0;
- Speed_Control(); //100ms进行一次速度控制
- LED_RED_TURN;
- SpeedCount=0;
- }
- cnt++;
- if(cnt==1) //4ms运行一次
- {
- flag=1;
- ADC_SAMPLE();
- Get_Attitude();
- Angle_Calculate();
- Angle_Control();
- Get_Speed();
-
- Direction_Control();
-
-
- }
- if(cnt>=2)
- {
- cnt=0;
- }
- SpeedCount++;
- Speed_Control_Output();
- Moto_Out();
-
- PIT->CHANNEL[0].TFLG |= PIT_TFLG_TIF_MASK;//清楚中断标志位
-
- }
- //定时器0中断函数
- void UART0_ISR(void)
- {
- static uint8 recv;
- static uint8 data_cnt=0;
- static uint8 predata[10];
- static uint8 Recv_Buff[100];
- static uint8 Data_Receiving=false;
-
- // recv=Uart_GetChar(UART1_BASE);
- /**********代表正在接收来自上位机的参数数据*********/
- if(Data_Receiving)
- {
- if(data_cnt<56)
- {
- Recv_Buff[data_cnt]= recv;
- data_cnt++;
- }
- else
- {
- data_cnt=0; //达到帧长
- Data_Receiving=false;
- if(recv==2) //帧尾
- {
- Modify_Parameter(Recv_Buff);
- SendPara=1; //参数回传,确认参数修改完成
- beep=1; //开启蜂鸣器
- }
- }
- }
-
-
- if( predata[1]==0x55&&predata[0]==0xAA)
- {
-
- switch(recv) //判断功能字
- {
- case 1: //读取参数
- if(SendPara==0) SendPara=1;
- beep=1; //开启蜂鸣器
- break;
-
- case 2: //修改参数
- data_cnt=0;
- Data_Receiving=true;
- case 3: //保存参数
- //EEPROM_Save();
- beep=1; //开启蜂鸣器
- break;
-
- case 4: //功能开关1
-
- break;
-
- case 5: //功能开关2
-
- break;
-
- case 6: //功能开关3
-
- break;
-
- case 7: //功能开关4
-
- break;
-
- default: //
- break;
- }
- }
- predata[1]=predata[0];
- predata[0]=recv;
- }
-
复制代码
注意代码不是用Keil写的,用的iar编译的
iar工程文件.7z
(1.01 MB, 下载次数: 262)
|