• 使用超核CH系列连接stm32,连接阿里云


    本文使用超核CH020系列,连接stm32f103vet6,使用hal库开发,将CH020传感器数据上传至阿里云平台。

    1.介绍超核CH020

    CH020拥有数据预处理和基于四元数的扩展卡尔曼(EKF)数据融合引擎,因此可以为用户提供原始数据,姿 态数据、四元数、温度等数据信息。

    详细介绍如下

    加速度(Accleration)含有重力并标定后的加速度

    角速度(Angular Rates) 标定后的角速度

    姿态角(Attitude) 俯仰(Pitch)、航滚(Roll)、航向(Yaw)

    四元数(Quaternion) 姿态四元数

    温度(Temprature)传感器内部温度

             左图:这是我手上的一款超核公司的ch020

    2.上位机使用

    我们将ch020通过type-B线连接至电脑,打开CHCenter上位机,然后点击左上角的连接,连接成功后就可以看见IMU的各项参数了,由于我这个是六轴的,所以磁场和气压都尚未配备,我们可以看见其他的参数还是十分完善的,比如说加速度、角速度、姿态信息,四元数。

    3.CH020与stm32配合使用                                                                                                                 

    我将串口二配置了ch020,以便解析传感器数据,串口三配置了esp8266,也就是WiFi模块,将收集到IMU的数据上传至云平台。

    1. void USART1_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
    2. {
    3. GPIO_InitTypeDef GPIO_InitStruct = {0};
    4. __HAL_RCC_GPIOA_CLK_ENABLE();
    5. __HAL_RCC_USART1_CLK_ENABLE();
    6. Usart_ISR.U1TXOver = Tx_Over;
    7. Usart_ISR.U1RXOperation = RxFunction;
    8. GPIO_InitStruct.Pin = GPIO_PIN_9;
    9. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    10. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    11. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    12. GPIO_InitStruct.Pin = GPIO_PIN_10;
    13. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    14. GPIO_InitStruct.Pull = GPIO_NOPULL;
    15. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    16. huart1.Instance = USART1;
    17. huart1.Init.BaudRate = BPS;
    18. huart1.Init.WordLength = UART_WORDLENGTH_8B;
    19. huart1.Init.StopBits = UART_STOPBITS_1;
    20. huart1.Init.Parity = UART_PARITY_NONE;
    21. huart1.Init.Mode = UART_MODE_TX_RX;
    22. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    23. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    24. if (HAL_UART_Init(&huart1) != HAL_OK)
    25. {
    26. Error_Handler();
    27. }
    28. __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    29. //USART1 NVIC ÅäÖÃ
    30. HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
    31. HAL_NVIC_EnableIRQ(USART1_IRQn);
    32. }
    33. void USART2_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
    34. {
    35. GPIO_InitTypeDef GPIO_InitStruct = {0};
    36. __HAL_RCC_GPIOA_CLK_ENABLE();
    37. __HAL_RCC_USART2_CLK_ENABLE();
    38. Usart_ISR.U2TXOver = Tx_Over;
    39. Usart_ISR.U2RXOperation = RxFunction;
    40. GPIO_InitStruct.Pin = GPIO_PIN_2;
    41. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    42. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    43. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    44. GPIO_InitStruct.Pin = GPIO_PIN_3;
    45. GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
    46. GPIO_InitStruct.Pull = GPIO_NOPULL;
    47. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    48. huart2.Instance = USART2;
    49. huart2.Init.BaudRate = BPS;
    50. huart2.Init.WordLength = UART_WORDLENGTH_8B;
    51. huart2.Init.StopBits = UART_STOPBITS_1;
    52. huart2.Init.Parity = UART_PARITY_NONE;
    53. huart2.Init.Mode = UART_MODE_TX_RX;
    54. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    55. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    56. if (HAL_UART_Init(&huart2) != HAL_OK)
    57. {
    58. Error_Handler();
    59. }
    60. __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    61. //USART2 NVIC ÅäÖÃ
    62. HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
    63. HAL_NVIC_EnableIRQ(USART2_IRQn);
    64. }

    这是串口二和串口三的hal库配置

    1. //´串口二接收
    2. uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
    3. {
    4. /* Check the parameters */
    5. assert_param(IS_USART_ALL_PERIPH(USARTx));
    6. /* Receive Data */
    7. return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
    8. }
    9. #define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */
    10. #define USART_IT_CTS ((uint16_t)0x096A)
    11. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
    12. {
    13. uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
    14. ITStatus bitstatus = RESET;
    15. /* Check the parameters */
    16. assert_param(IS_USART_ALL_PERIPH(USARTx));
    17. assert_param(IS_USART_GET_IT(USART_IT));
    18. /* The CTS interrupt is not available for UART4 and UART5 */
    19. if (USART_IT == USART_IT_CTS)
    20. {
    21. assert_param(IS_USART_123_PERIPH(USARTx));
    22. }
    23. /* Get the USART register index */
    24. usartreg = (((uint8_t)USART_IT) >> 0x05);
    25. /* Get the interrupt position */
    26. itmask = USART_IT & IT_Mask;
    27. itmask = (uint32_t)0x01 << itmask;
    28. if (usartreg == 0x01) /* The IT is in CR1 register */
    29. {
    30. itmask &= USARTx->CR1;
    31. }
    32. else if (usartreg == 0x02) /* The IT is in CR2 register */
    33. {
    34. itmask &= USARTx->CR2;
    35. }
    36. else /* The IT is in CR3 register */
    37. {
    38. itmask &= USARTx->CR3;
    39. }
    40. bitpos = USART_IT >> 0x08;
    41. bitpos = (uint32_t)0x01 << bitpos;
    42. bitpos &= USARTx->SR;
    43. if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
    44. {
    45. bitstatus = SET;
    46. }
    47. else
    48. {
    49. bitstatus = RESET;
    50. }
    51. return bitstatus;
    52. }
    53. #define USART_IT_RXNE ((uint16_t)0x0525)
    54. void USART2_IRQHandler(void)
    55. {
    56. uint8_t ch;
    57. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    58. {
    59. ch = USART_ReceiveData(USART2);
    60. }
    61. /* decode each byte */
    62. decode_succ = ch_serial_input(&raw, ch);
    63. }

     这是串口二的接收函数,将接收到的数据存入并解析。

    1. int main(void)
    2. {
    3. HAL_Init();
    4. SystemClock_Config();
    5. SysTick_Init(systick_isr);
    6. USART1_Init(115200,NULL,NULL);
    7. USART2_Init(115200,NULL,NULL);;
    8. ESP_Init(); //WIFI³õʼ»¯
    9. AliYun_Mqtt_Init(); //³õʼ»¯É豸ID,API_KEY
    10. while(1)
    11. {
    12. if(esp_connect_ok != ESP_STA_CONNECTED)
    13. {
    14. ESP_Client_ConnectServer(0,(u8 *)Server_Addr,(u8 *)"1883",(u8 *)"123",(u8 *)"ljt558..");
    15. connect_ok = MQTT_IDLE;
    16. }
    17. else
    18. {
    19. if(connect_ok == MQTT_IDLE) //ûÓн¨Á¢MQTTÁ¬½Óʱ,·¢ÆðMQTTÁ¬½Ó
    20. {
    21. //½¨Á¢MQTTÁ¬½Ó
    22. AliYun_Mqtt_Connect();
    23. connect_ok = MQTT_WAIT;
    24. }
    25. }
    26. ESP_RecvProcess();
    27. if(decode_succ)
    28. {
    29. decode_succ = 0;
    30. delay_ms(1000);
    31. ch_dump_imu_data(&raw);
    32. senddata(&raw);
    33. delay_ms(1000);
    34. }
    35. }
    36. }

    主函数配置,前面配置了时钟信号,后面配置串口初始化,中断,连云函数等等。

    将代码烧入单片机里。

    4.查看串口助手和云平台

     可以看见,我们解析了数据,并按两秒的延时打印出来(测试需要,实际并不用设置这么高的延时)。

    解析出来的数据分别是xyz轴上的加速度,角速度,以及姿态信息,例如横滚角,俯视角,航向角,四元数,温度。

    图为:云平台数据

    本来想将所有数据上传至云平台的,奈何一个一个建立物模型太过于麻烦,于是建立了xyz轴上的加速度,角速度便于观看。

    CH020与单片机的连接,不仅仅是我们这样的简单使用,更多的是

    CH0X0系列可以精确地感知移动设备的俯仰(Pitch)、横滚(Roll)、航向(Yaw)等姿态信息,比如 AR/VR,自动导引小车(AGV),巡检机器人、无人机等应用领域。它可与激光雷达(Lidar)、视觉(Camera) 等导航方案形成优势互补,增强设备的导航精度,并减小对外界参考物体的依赖。典型的应用市场如下:

    自动导引小车(AGV/AMR)

    服务机器人

    巡检机器人

    组合导航(INS)

    工程机械

    智慧农机

    倾角检测

    这些应用市场都大有可为,希望更多的开发者能将这块IMU应用于更多场景。

  • 相关阅读:
    vscode 调试和远程
    python判断语句
    C++系列之list的模拟实现
    std::minus
    P2014 [CTSC1997] 选课(树形DP)
    MySQL安全基线检查
    C++ 手动实现栈(stack) (课后作业版)
    【电脑Tips】Win11自动更新之后开机黑屏
    【NLP】使用递归神经网络对序列数据进行建模 (Pytorch)
    特征工程 - 当你遇到正负样本不均
  • 原文地址:https://blog.csdn.net/ljt2333/article/details/132639420