|
- #include <PID_v1.h>
- /*陀螺仪使用的定义变量*/
- unsigned char Re_buf[11],counter=0;
- unsigned char sign=0;
- /*电机使用定义的变量*/
- int motor_a1=4;
- int motor_a2=5;
- int motor_b1=6;
- int motor_b2=7;
- int ena=10;
- int enb=11;
- /*定义PID库使用的参数*/
- double Setpoint, Input, Output;
- double kp,ki,kd;
- /*定义PID程序*/
- PID myPID(&Input, &Output, &Setpoint,kp,ki,kd, DIRECT);
- /*初始化*/
- void setup() {
- Serial.begin(115200); //初始化串口速率
- /*配置电机针脚为输出*/
- pinMode(motor_a1,OUTPUT);
- pinMode(motor_a2,OUTPUT);
- pinMode(motor_b1,OUTPUT);
- pinMode(motor_b2,OUTPUT);
- myPID.SetMode(AUTOMATIC); //配置PID为自动模式
- myPID.SetSampleTime(100); //配置PID采样率为100毫秒
- Setpoint = -1; //设置小车平衡点角度
- }
- /*主函数*/
- void loop() {
- if (sign==0)
- return; //sign为数据更新标志,每隔10ms更新一次,也就是说以下代码每隔10ms控制一次
- sign=0;
- // getkpkikd(&kp,&ki,&kd); //获取kp,ki,kd的值
- kp=(double)analogRead(0)/1024*200;
- ki=(double)analogRead(1)/10240;
- kd=(double)analogRead(2)/1024*400;
- myPID.Compute(); //PID运算
- SetMotor(Output); //控制电机
- // cout2serial() ; //串口输出需要查看的数据
- Serial.print("angle:");
- Serial.print(Input);Serial.print(" ");
- Serial.print("output:");
- Serial.print(Output);Serial.print(" ");
- Serial.print("kp:");
- Serial.print(kp);Serial.print(" ");
- Serial.print("ki:");
- Serial.print(ki);Serial.print(" ");
- Serial.print("kd:");
- Serial.print(kd);Serial.println(" ");
- }
- /*获取kp,ki,kd的值的函数*/
- /*void getkpkikd(&kp,&ki,&kd){
- kp=(double)analogRead(0)/1024*200;
- ki=(double)analogRead(1)/10240;
- kd=(double)analogRead(2)/1024*400;
- }*/
- /*控制电机运行的函数*/
- void SetMotor(float Output)
- {
- if (Output>=0){
- pinMode(motor_a1,HIGH);
- pinMode(motor_a2,LOW);
- pinMode(motor_b1,HIGH);
- pinMode(motor_b2,LOW);
- analogWrite(ena,Output);
- analogWrite(enb,Output);
- }
- else if (Output<0) {
- pinMode(motor_a1,LOW);
- pinMode(motor_a2,HIGH);
- pinMode(motor_b1,LOW);
- pinMode(motor_b2,HIGH);
- analogWrite(ena,abs(Output));
- analogWrite(enb,abs(Output));
- }
- }
- /*输出串口数据的函数*/
- /*void cout2serial() {
- Serial.print("angle:");
- Serial.print(Input);Serial.print(" ");
- Serial.print("output:");
- Serial.print(Output);Serial.print(" ");
- Serial.print("kp:");
- Serial.print(kp);Serial.print(" ");
- Serial.print("ki:");
- Serial.print(ki);Serial.print(" ");
- Serial.print("kd:");
- Serial.print(kd);Serial.println(" ");
- }*/
- void serialEvent()
- {
- while (Serial.available()) {
- Re_buf[counter]=(unsigned char)Serial.read();
- if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头
- counter++;
- if(counter==11) //接收到11个数据
- {
- counter=0; //重新赋值,准备下一帧数据的接收
- switch(Re_buf [1])
- {
- case 0x51:
- break;
- case 0x52:
- break;
- case 0x53:
- Input= double(short(Re_buf [3]<<8| Re_buf [2]))/32768*180;
- sign=1;
- break;
- }
- }
- }
- }
复制代码 不知道为什么Output 为零 |
|