/********************************* * 主函数 **********************************/ void main() { //uchar i; Init_IO(); //I/O口初始化, Init_MCU(); //主函数初始化,T0定时器工作在方式1初始化,显示"请稍等,初始化中",GATE=0, Init_RAM(); //位变量初始化 Init_Para(); //参数初始化,初始化参数,从IIC读取阈值等信息赋予给参量 Init_Buf(); //并口通讯数组初始化 // Select_Mast(); //判断主从机 Init_Time0(); //开启定时器0。定时器0初始化,工作在方式一,定时初值:H:0xDC,L:0x00;中断计数初始化?定时5ms,NumT0=0; Lcd_Clear(); //LCD清屏 Lcd_Start(); //显示"清华大学/n核能与新能源技术研究院" EX0=1; //只允许外部0中断,中断0为键盘 IT0=1; //外部中断0 while(1) { // BackUp_Display(); Select_Mast(); //判断主从机,写入主从机标志Flag_Mast=1(主机)0(从机) key_function(); //按键功能,在while循环中不断检测按键标志,按键标志由按键外部中断来更改 if(Flag_Tim0) //8253计数定时结束时,读取探头的计数,刚开始Flag_Tim0=0,仅当Flag8253Counting计数定时标识为1,且计数器中断次数大于设定的中断次数时,Flag_timo才会等于1 { //Flag_Tim0为计数器结束标志,初始为0,开机打开定时器中断后,定时器5ms中断一次,检查Flag_Tim0一次,为一表示计数器计时结束 Flag_Tim0 = 0; //定时标志清0 Flag_Warn = 0; //报警标志清0 GetAndDisdata(); //从8253的锁存器得到测量计数器结果,存入至buf数组 ShowData(); //显示测量数据 shortdelay(1000); // Transfer(); //并行传输数据 // bakeup_conv_data(); Init_8253(); //初始化8253 //定时结束时,立刻又开始初始化进行计数 } if(Flag_Tim0 == 0) //开启8253计数过程中,处理报警中断,报警有中断吗? { if(Flag_Warn_Flash == 1) //主机LED指示灯闪烁间隔定时,Flag_Warn_Flash为LED灯闪烁标志 { Flag_Warn_Flash = 0; Led_Flash(); } if((Flag_Warn_Led==1) && (PCOLSIG==0)) //屏幕上红灯闪烁间隔定时,程序中没有找到PCOLSIG=0的程序段 { Flag_Warn_Led = 0; RedLed_Flash(); //灯闪烁 } } } }
int TIM1_UP_IRQHandler(void) { static int SysTime = 0; if(TIM1->SR&0X0001)//5ms定时中断 { TIM1->SR&=~(1<<0); //===清除定时器1中断标志位 Flag_Target=!Flag_Target; if(Flag_Target==1) //5ms读取一次陀螺仪和加速度计的值,更高的采样频率可以改善卡尔曼滤波和互补滤波的效果 { Get_Angle(Way_Angle); //===更新姿态 return 0; } //10ms控制一次,为了保证M法测速的时间基准,首先读取编码器数据 // Encoder_Left=Read_Encoder(2); //===读取编码器的值, // Encoder_Right=Read_Encoder(3); //===读取编码器的值 Get_Angle(Way_Angle); //===更新姿态 Led_Flash(100); //===LED闪烁;指示单片机正常运行 Key(); //===扫描按键状态 单击双击可以改变小车运行状态 // Balance_Pwm =balance(Angle_Balance,Gyro_Balance); //===平衡PID控制 // Velocity_Pwm=velocity(Encoder_Left,Encoder_Right); //===速度环PID控制 记住,速度反馈是正反馈,就是小车快的时候要慢下来就需要再跑快一点 // Turn_Pwm =turn(Encoder_Left,Encoder_Right,Gyro_Turn); //===转向环PID控制 // Moto1=Balance_Pwm+Velocity_Pwm+Turn_Pwm; //===计算左轮电机最终PWM // Moto2=Balance_Pwm+Velocity_Pwm-Turn_Pwm; //===计算右轮电机最终PWM SysTime += 10; // Moto1 = PWMOut(waveOut( 0.5, 1, 0, 0, SysTime) ); // Moto2 = PWMOut(waveOut( 0.5, 1, (30/180*PI), 0, SysTime)); Moto1 = PWMOut(&motorCMD[0],SysTime); Moto2 = PWMOut(&motorCMD[1],SysTime); Moto3 = PWMOut(&motorCMD[2],SysTime); Moto4 = PWMOut(&motorCMD[3],SysTime); // Xianfu_Pwm(); //===PWM限幅 // if(Turn_Off(Angle_Balance,Voltage)==0) //===如果不存在异常 //printf("PWMOUT A : %d",Moto1 ); //printf("PWMOUT B : %d",Moto2 ); // if(SysTime%1000==0)printf("PWMOUT A : %d",Moto1 ); Set_Pwm(Moto1,Moto2,Moto3,Moto4); //===赋值给PWM寄存器 } return 0; }