开源云台的一些代码,有看懂的大神,可以给我详细解释下吗?谢谢

2019-10-15 23:00发布

本帖最后由 greenHands 于 2016-6-15 17:40 编辑

//这下面的函数看不懂
void engineProcess(void)
{
        LEDon;      
        DEBUG_LEDoff;
        while(ConfigMode==1){TimerOff();}//Configuration loop         
        MPU6050_ACC_get(); //Getting Accelerometer data   
        acc_roll_angle = -(atan2(accADC_x, accADC_z))+(configData[11]-50.00)*0.0035;   
        acc_pitch_angle= +(atan2(accADC_y, accADC_z));                                                                   
        MPU6050_Gyro_get();                                                                                                               
        acc_roll_angle_vid = ((acc_roll_angle_vid  * 99.00)+ acc_roll_angle ) / 100.00;            <--这样做的用途是什么?   
        acc_pitch_angle_vid= ((acc_pitch_angle_vid * 99.00)+ acc_pitch_angle) / 100.00;                    
        sinus        = sinusas[(int)(rc4)];                                                                                                     
        cosinus        = sinusas[90-(int)(rc4)];                                                                                   
        ROLL =- gyroADC_z * sinus + gyroADC_y * cosinus;
        roll_angle = (roll_angle + ROLL * dt) + 0.0002 * (acc_roll_angle_vid-roll_angle);         
        //ROLL=-gyroADC_z*sinus+gyroADC_y*cosinus;        
        pitch_angle_true = ((pitch_angle_true + gyroADC_x * dt) + 0.0002 * (acc_pitch_angle_vid - pitch_angle_true)); //Pitch Horizon
        sukimas = sukimas + gyroADC_x * dt;
        rc4_avg = ((rc4_avg * 499.00) + (rc4)) / 500.00;                                
        pitch_angle = pitch_angle_true - rc4_avg / 57.3;               
        pitch_angle_correction = pitch_angle * 50.0;                        
        if(pitch_angle_correction >   1.0){                pitch_angle_correction =   1.0;        }
        if(pitch_angle_correction < -1.0){                pitch_angle_correction = -1.0;        }
        pitch_setpoint = pitch_setpoint + pitch_angle_correction;  
        roll_angle_correction = roll_angle * 50.0;                                //roll
        if(roll_angle_correction >   1.0){                roll_angle_correction =   1.0;                }
        if(roll_angle_correction < -1.0){                roll_angle_correction = -1.0;                }
        roll_setpoint = roll_setpoint + roll_angle_correction;                     
        if(tim_conf == 0)
        {
                //rewrite that thing;        
                Timer1_Config();
                Timer8_Config();
                Timer5_Config();
                Timer4_Config();
                tim_conf = 1;
                TIM_Cmd(TIM5, ENABLE);
                TIM_CtrlPWMOutputs(TIM5, ENABLE);
                for (n=1 ; n<4 ; n++);                                                                                 
                TIM_Cmd(TIM4, ENABLE);
                TIM_CtrlPWMOutputs(TIM4, ENABLE);
        }
        pitch_PID();//Pitch axis pid               
        roll_PID(); //Roll axis pid
        printcounter++; //Print data to UART        
        if (printcounter>=50)
        {
                printcounter=0;
        }
        stop=0;
        LEDoff;               
        watchcounter=0;        
}
------
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zacy2011
1楼-- · 2019-10-16 01:20
csdn有我上传的bgc和evvgc的源码,比较清晰,可以自己搜一下。
正点原子
2楼-- · 2019-10-16 07:09
 精彩回答 2  元偷偷看……
zacy2011
3楼-- · 2019-10-16 09:05
感觉像是evvgc的代码,读取MPU6050数据,然后求欧拉角(atan2部分,不是严格意义上的欧拉角),vid是进行低通滤波,true是一阶互补滤波,然后pid控制
Embedded
4楼-- · 2019-10-16 10:36
这个云台算法我都研究透了,正要把玩一下
权哥在这
5楼-- · 2019-10-16 15:56
关注一下,希望有人有文档类的原理性解释
程序不想抄

一周热门 更多>