使用超核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的数据上传至云平台。

void USART1_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
   
	
    __HAL_RCC_GPIOA_CLK_ENABLE();	
	__HAL_RCC_USART1_CLK_ENABLE();
	  
    Usart_ISR.U1TXOver = Tx_Over;   	     
    Usart_ISR.U1RXOperation = RxFunction;  

	GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		
	huart1.Instance = USART1;
    huart1.Init.BaudRate = BPS;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
      Error_Handler();
    }
		
		__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);  

	   //USART1 NVIC ÅäÖÃ	
	   HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);
	   HAL_NVIC_EnableIRQ(USART1_IRQn);
}

void USART2_Init(unsigned int BPS, void Tx_Over(void), void (*RxFunction)(unsigned char RX_Data))
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
   
	
    __HAL_RCC_GPIOA_CLK_ENABLE();	
	__HAL_RCC_USART2_CLK_ENABLE();
	  
    Usart_ISR.U2TXOver = Tx_Over;   	   
	Usart_ISR.U2RXOperation = RxFunction;  

	GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		
	huart2.Instance = USART2;
    huart2.Init.BaudRate = BPS;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart2) != HAL_OK)
    {
      Error_Handler();
    }
		
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);  

	   //USART2 NVIC ÅäÖÃ	
	   HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
	   HAL_NVIC_EnableIRQ(USART2_IRQn);
}

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

//´串口二接收
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}

#define IT_Mask                   ((uint16_t)0x001F)  /*!< USART Interrupt Mask */
#define USART_IT_CTS                         ((uint16_t)0x096A)

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
{
  uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
  ITStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_GET_IT(USART_IT));
  /* The CTS interrupt is not available for UART4 and UART5 */ 
  if (USART_IT == USART_IT_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }   
  
  /* Get the USART register index */
  usartreg = (((uint8_t)USART_IT) >> 0x05);
  /* Get the interrupt position */
  itmask = USART_IT & IT_Mask;
  itmask = (uint32_t)0x01 << itmask;
  
  if (usartreg == 0x01) /* The IT  is in CR1 register */
  {
    itmask &= USARTx->CR1;
  }
  else if (usartreg == 0x02) /* The IT  is in CR2 register */
  {
    itmask &= USARTx->CR2;
  }
  else /* The IT  is in CR3 register */
  {
    itmask &= USARTx->CR3;
  }
  
  bitpos = USART_IT >> 0x08;
  bitpos = (uint32_t)0x01 << bitpos;
  bitpos &= USARTx->SR;
  if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  
  return bitstatus;  
}
#define USART_IT_RXNE                        ((uint16_t)0x0525)

void USART2_IRQHandler(void)
{
	uint8_t ch;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        ch = USART_ReceiveData(USART2);	
    }
    
    /* decode each byte */
    decode_succ = ch_serial_input(&raw, ch);
} 

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

int main(void)
{
  HAL_Init();
  SystemClock_Config();
	SysTick_Init(systick_isr);
	USART1_Init(115200,NULL,NULL);
	USART2_Init(115200,NULL,NULL);;
	ESP_Init();   //WIFI³õʼ»¯
  AliYun_Mqtt_Init();   //³õʼ»¯É豸ID,API_KEY
	  while(1)
    { 
		  if(esp_connect_ok != ESP_STA_CONNECTED)  
		  {
			  ESP_Client_ConnectServer(0,(u8 *)Server_Addr,(u8 *)"1883",(u8 *)"123",(u8 *)"ljt558..");  
			  connect_ok = MQTT_IDLE;
		  }
		  else
		  {
			  if(connect_ok == MQTT_IDLE)  //ûÓн¨Á¢MQTTÁ¬½Óʱ,·¢ÆðMQTTÁ¬½Ó
			 {
				//½¨Á¢MQTTÁ¬½Ó
				AliYun_Mqtt_Connect();
				connect_ok = MQTT_WAIT;
			 }
		  }
		ESP_RecvProcess();	 
        if(decode_succ)
        {
            decode_succ = 0;
            delay_ms(1000);
            ch_dump_imu_data(&raw);
					  senddata(&raw);
				  	 delay_ms(1000);
        }
     	}
		}

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

将代码烧入单片机里。

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

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

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

图为:云平台数据

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

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

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

自动导引小车(AGV/AMR)

服务机器人

巡检机器人

组合导航(INS)

工程机械

智慧农机

倾角检测

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值