圆咕噜咕噜 发表于 2024-8-7 13:04:57

24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到

媒介

        只要搞懂 M0 的代码结构和 CCS 的图形化配置方法,代码移植就会变的很简朴。因为本次电赛的须要,正好陀螺仪部门代码的移植是我完成的。(末端附全部代码)
一、JY60 陀螺仪

        JY60特点
        1.模块集成高精度的陀螺仪、加速度计,接纳高性能的微处理惩罚器和先辈的动力学解算与卡尔曼动态滤波算法,可以或许快速求解出模块当前的及时运动姿态。
        2.接纳先辈的数字滤波技术,能有效降低丈量噪声,提高丈量精度。
        3.模块内部集成了姿态解算器,配合动态卡尔曼滤波算法,可以或许在动态环境下正确输出模块的当前姿态,姿态丈量精度0.2°,稳定性极高,性能甚至优于某些专业的倾角仪。
        因为此次主要使用的是航向角,下面是航向角的参数:
https://i-blog.csdnimg.cn/direct/f10c661ad961494998ea8edd683ceb4a.png
 
https://i-blog.csdnimg.cn/direct/aeac77179d134bd4bb326b7b927845fb.png
二、syscfg 配置

        我使用的是串口来接收陀螺仪数据,下面是串口的配置。
https://i-blog.csdnimg.cn/direct/1b0db4916ccf48f492b462bda4ea801b.png
https://i-blog.csdnimg.cn/direct/54b0aead66ee4076be8859e181a19cd8.png
https://i-blog.csdnimg.cn/direct/dcf11b2f589143a7b9656e58480065bc.png
三、串口接收部门代码

        其他代码都直接复制就行,只有串口部门代码须要修改。
        UART2.c
// #include "misc.h"
#include "wit_c_sdk.h"
#include "ti_msp_dl_config.h"
#include "stdio.h"
#include "UART2.h"
#include "stdint.h"


// // 初始化 UART 引脚和多路复用
// void InitUARTPins(void) {
//   DL_GPIO_setDirection(GPIO_UART_BT_RX_PORT, GPIO_UART_BT_RX_PIN, DL_GPIO_INPUT);
//   DL_GPIO_setDirection(GPIO_UART_BT_TX_PORT, GPIO_UART_BT_TX_PIN, DL_GPIO_OUTPUT);
//   DL_GPIO_setIOMUX(GPIO_UART_BT_RX_PORT, GPIO_UART_BT_RX_PIN, GPIO_UART_BT_IOMUX_RX_FUNC);
//   DL_GPIO_setIOMUX(GPIO_UART_BT_TX_PORT, GPIO_UART_BT_TX_PIN, GPIO_UART_BT_IOMUX_TX_FUNC);
// }

void Usart2Init(unsigned int uiBaud) {
    // 配置 UART 引脚和多路复用
    // InitUARTPins();

    // // 初始化 UART
    // DL_UART_init(UART_BT_INST, uiBaud, DL_UART_PARITY_NONE, DL_UART_STOPBITS_ONE, DL_UART_DATABITS_8);

    // 使能 UART 接收中断
    // DL_UART_enableInterrupt(UART_BT_INST, DL_UART_MAIN_IIDX_RX);

    // 使能 UART 中断
    NVIC_EnableIRQ(UART_BT_INST_INT_IRQN);
}

void UART_BT_INST_IRQHandler(void) {
    uint8_t Res;

    // 检查是否有接收中断
    if (DL_UART_getPendingInterrupt(UART_BT_INST) == DL_UART_MAIN_IIDX_RX) {
      Res = DL_UART_receiveData(UART_BT_INST);
      WitSerialDataIn(Res);
//         DL_UART_clearPendingInterrupt(UART_BT_INST, DL_UART_MAIN_IIDX_RX);
    }
}

void Uart2Send(unsigned char *p_data, unsigned int uiSize) {
    for (unsigned int i = 0; i < uiSize; i++) {
      DL_UART_transmitDataBlocking(UART_BT_INST, p_data);
    }
}
四、其他部门代码

        这里主要说名一下 gryo.c 中的获取陀螺仪值的代码。其中 gryo_get() 是获取陀螺仪值。其中fAcc, fGyro, fAngle分别代表三向加速度,三向角速度与三向角度。
        gryo.c
float fAcc, fGyro, fAngle;


void gryo_get(){
       
       
        int i;
       
        //if(s_cDataUpdate)
                //{
                        for(i = 0; i < 3; i++)
                        {
                                fAcc = sReg / 32768.0f * 16.0f;
                                fGyro = sReg / 32768.0f * 2000.0f;
                                fAngle = sReg / 32768.0f * 180.0f;
                        }
                        //         fAcc=fAcc+sin(fAngle*(M_PI/180));
                        //   fAcc=fAcc-sin(fAngle*(M_PI/180));
                        // printf("gyro:%.3f %.3f %.3f\r\n", fGyro, fGyro, fGyro);
                        // 应用低通滤波器
//                        for (i = 0; i < 2; i++) // 这里只对X和Y轴进行滤波
//                        {
//                                fAccFiltered = alpha * fAcc + (1 - alpha) * fAccFiltered;
//                                fAcc=fAccFiltered;
//                        }
//                        if(s_cDataUpdate & ACC_UPDATE)
//                        {
//                                //printf("acc:X%.3f Y%.3f Z%.3f\r\n", fAcc, fAcc, fAcc);
//                                printf("acc:X%.3f Y%.3f\r\n", fAcc, fAcc);

//                                s_cDataUpdate &= ~ACC_UPDATE;
//                        }
//                        if(s_cDataUpdate & GYRO_UPDATE)
//                        {
//                                printf("gyro:%.3f %.3f %.3f\r\n", fGyro, fGyro, fGyro);
//                                s_cDataUpdate &= ~GYRO_UPDATE;
//                        }
//                        if(s_cDataUpdate & ANGLE_UPDATE)
//                        {
//                                printf("angle:Y:%.3f X:%.3f Z:%.3f\r\n", fAngle, fAngle, fAngle);
//                        //        printf("angle:Y:%.3f\r\n", fAngle);
//                                s_cDataUpdate &= ~ANGLE_UPDATE;
//                        }
//                        if(s_cDataUpdate & MAG_UPDATE)
//                        {
//                                printf("mag:%d %d %d\r\n", sReg, sReg, sReg);
//                                s_cDataUpdate &= ~MAG_UPDATE;
//                        }
                //}

}

        主函数调用代码:
#include "ti_msp_dl_config.h"
#include "stdio.h"
#include "string.h"
#include "UART2.h"
#include "wit_c_sdk.h"
#include "gryo.h"
#include "delay.h"


int main(void)
{
    SYSCFG_DL_init();//整体初始化

    NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);//串口打印初始化
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);

    Usart2Init(UART_BT_BAUD_RATE);
        // Usart2Init(9600);
        WitInit(WIT_PROTOCOL_NORMAL, 0x50);
        WitSerialWriteRegister(SensorUartSend);
        WitRegisterCallBack(SensorDataUpdata);
        WitDelayMsRegister(Delayms);
        //AutoScanSensor();
        printf("nihao\r\n");
        while (1)
        {
                // printf("begining\r\n");
                delay_ms(10);
                gryo_get();
      
        }
}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到