0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >计算机及配件 > 平衡单车

平衡单车

2021-07-21
类别:计算机及配件
eye 1
文章创建人 龙8游戏官网网址

原标题:平衡单车

cirmall

cirmall

cirmall

cirmall


  #include "LQ_balance.h" // 定义在DMP中,在此引用 extern float data Pitch, Roll; // extern封装库中的俯仰角与翻滚角 extern short data gyro[3], accel[3]; // extern封装库中的陀螺仪XYZ,加速度XYZ变量 short data Velocity = 60; // 速度,定时周期内为60个脉冲,龙邱带方向512编码器 float data Angle_Balance; // 陀螺仪DMP获取倾角 unsigned short data Encoder; // 编码器的脉冲计数 short data PWMMotor, PWMServo; // 电机舵机PMW变量中值 short data Motor_Bias, Motor_Last_Bias, Motor_Integration; // 电机所用参数 unsigned char Flag_Stop = 1, Flag_Show, Flag_Imu; // 停车,显示,IMU完成标志位 float data Zhongzhi = -4.5; // 小车平衡角度中值 #define Balance_Kp 32.5// 舵机PID参数 #define Balance_Kd 0.10 // 舵机PID参数 #define Balance_Ki 0.0010 // 舵机PID参数 //囧囧囧舵机平衡所用的PID系数,需要把宏定义改为变量,改为变量就容易出错囧,偶尔也会正常囧 //float Balance_Kp = 39.5, Balance_Kd = 0.1, Balance_Ki = 0.0026; // PID参数 囧 #define Motor_Kp 12 // 电机PID参数 #define Motor_Ki 20 // 电机PID参数 #define Turn_Kp 0.55 // 转向PID参数 float data Integration; // 循迹相关 unsigned char Flag_getTurn = 0; extern int left, right; extern uint16_t data LnowADC[4]; #define L0MAX 1600 // 右竖直电感最大值: #define L1MAX 1780 // 右水平电感最大值:1780 #define L2MAX 1630 // 左水平电感最大值:1630 #define L3MAX 1600 // 左竖直电感最大值: #define L0MIN 200 // 右竖直电感-->最小值:107 #define L1MIN 240 // 右水平电感-->最小值:104 #define L2MIN 240 // 左水平电感-->最小值:108 #define L3MIN 200 // 左竖直电感-->最小值:100 /*LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL 【函数名】void INT2_int (void) interrupt 10 // 外部中断或者定时中断,5ms 【功 能】最关键的数据处理均在此函数中,通过6050陀螺仪int管脚输出信号,每5ms执行一次 使用外部中断或者定时器均可。 【参数值】无 【返回值】无 【作 者】chiusir 【最后更新】2021年1月22日 【软件版本】V1.0 QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ*/ //void timer0_int(void) interrupt 1 // 定时器中断,5ms,与下面外部中断二选一 void INT2_int (void) interrupt 10 // 陀螺仪FIFO定时中断,5ms, { int data Servo_PWM; // 舵机PID ///////转向控制,不循迹可以注释掉下面四行/////////////////////////// Zhongzhi = (short)(left - right) / 10;// 根据电感采集的归一化偏差数值计算中值的位置 Zhongzhi = 0.5 - Turn_Kp*Zhongzhi; // 计算期望的倾斜角度 if(Zhongzhi > 4.5) Zhongzhi = 4.5; // 左拐,限幅 if(Zhongzhi < -3.5) Zhongzhi = -3.5; // 右拐,限幅 Encoder = myabs(Read_Encoder(1)); // 编码器采值 //LQ_DMP_Read();// 囧囧囧放这里就卡死,只能放循环里面了,为什么???IMU读取大约需要1.7ms囧 Angle_Balance=Roll; // Angle_Balance=0.98*(Angle_Balance+gyro[1])+0.02*accel[0]; //一阶互补滤波 Key_Process(); // 按键控制,控制发车等 // // Velocity = 60 - myabs(left - right) * 0.1; // 变速控制 // Velocity = 45 + myabs((int)Angle_Balance) * 1.5; // 变速控制 // Servo_PWM = SBB_Get_BalancePID(Angle_Balance, gyro[1]); // PID计算单车平衡的PWM数值 if( Servo_PWM < - Servo_Delta) Servo_PWM = - Servo_Delta;// 舵机角度限制 else if(Servo_PWM > Servo_Delta) Servo_PWM = Servo_Delta;// 舵机角度限制 PWMServo = Servo_Center + Servo_PWM; // 转换为舵机控制PWM PWMMotor = SBB_Get_MotorPI(Encoder, Velocity) / 18; // 电机增量式PI控制 //if(left == 99 && right == 99) Flag_Stop = 1; // 冲出赛道停车 if(Angle_Balance > 35 || Angle_Balance < -45) Flag_Stop = 1;// 摔倒停车判断 if(Flag_Stop == 1) // 停车 { PWMMotor = 0; // 电机关闭 PWMServo = Servo_Center; // 舵机回中 Integration = 0; // 积分参数归零 } MotorCtrl(PWMMotor - 60,0); // 电机PWM,加上电机死区 ServoCtrl(PWMServo); // 舵机控制PWM,舵机范围:【约1500±300】 Flag_Imu = 1; // IMU采值标志,在中断结束后采值 Flag_getTurn++; // 转向标志 Flag_Show++; // OLED信息显示标志 Led_Flash(10); // LED闪烁,用来提示程序是否卡死 }


责任编辑:

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系龙8游戏官网网址(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,龙8游戏官网网址不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系龙8游戏官网网址(marketing@iczoom.com)注明“转载原因”。未经允许私自转载龙8游戏官网网址将保留追究其法律责任的权利。

龙8游戏官网网址拥有对此声明的最终解释权。

下一篇: 已是最后一篇
标签: 512编码器

相关资讯