瑞萨单片机william hill官网
直播中

华仔stm32

3年用户 2985经验值
擅长:嵌入式技术
私信 关注
[经验]

【瑞萨RA4系列开发板体验】CAN网络电压采集系统

电压表

电压采集后,除了利用OLED展示之外,还可以通过其他方式分享同去,这次我利用CAN与飞凌OK3568进行数据分享。
硬件平台

1、飞凌OK3568开发板一块。

2、瑞萨RA4M2开发板一块。

3、跳线器一个。

4、CAN分析仪一个。

5、数据电源一台。

联网方式 】CAN

【通讯协议】

can波特率为500K

ID:001为电压值

data[0]为电压值高8位,data[1]为电压值低8位。转换公式为(data[0]<<8 + data[1]) /4096 *3.3

【具体代码】
新建can发送数据函数:

void can_send_v(uint16_t data)
{
  fsp_err_t err = FSP_SUCCESS;
  uint32_t time_out = WAIT_TIME;                                      // time out
  uint8_t can_tx_msg[8] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    
  uint8_t can_rx_msg[8] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};     
  /* Initialize CAN module */
    err = R_CAN_Open(&g_can0_ctrl, &g_can0_cfg);
    /* Error trap */
    if(FSP_SUCCESS != err)
    {
        printf("\r\nCAN Open API failed");
    }

    g_can_tx_frame.id = 0x001;
    g_can_tx_frame.type = CAN_FRAME_TYPE_DATA;
    g_can_tx_frame.data_length_code = 8;
    
    /* copy the tx data frame with TX_MSG */
    g_can_tx_frame.data[0] = (uint8_t)(data>>8);
    g_can_tx_frame.data[1] = (uint8_t)data;
    //memcpy((uint8_t*)&g_can_tx_frame.data[ZERO], (uint8_t*)&can_tx_msg[ZERO], CAN_FRAME_TRANSMIT_DATA_BYTES);
    
    err = R_CAN_Write(&g_can0_ctrl, CAN_MAILBOX_NUMBER_0, &g_can_tx_frame);
     if (FSP_SUCCESS != err)
      {
          printf("\r\n CAN Write API FAILED");
          can_deinit();
      }

      /* wait for transmit flag bit to set */
      while ((true != b_can_tx) && (--time_out));
      if (RESET_VALUE == time_out)
      {
          printf("CAN transmission failed due to timeout");
      }
      /* Reset flag bit */
      b_can_tx = false;
  
}

传入参数为16位无符号整数,刚好为ADC采样的电压值。
修改adc采样函数如下:

void read_adc(void)
{
  fsp_err_t err = FSP_SUCCESS;
  double a0;
  uint16_t adc_data0=0;
  char vbuf[10];
  (void) R_ADC_ScanStart(&g_adc0_ctrl);
   scan_complete_flag = false;
  while (!scan_complete_flag)
  {
      /* Wait for callback to set flag. */
  }
  
  err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_2, &adc_data0);
  assert(FSP_SUCCESS == err);
  a0=(double)(adc_data0/4095.0)*3.3;
  printf("v: %.03f \r\n",a0);
  sprintf(vbuf,"%.03fV",a0);
  OLED_ShowString(24,24,vbuf,24);
  can_send_v(adc_data0);//这里用于CAN发送数据出去。
}

在飞凌OK开发板上,对数据进行解析:

if id == 0x001:
            get_v = int(msg.data[0]) * 256 + int(msg.data[1])
            get_v =(float(get_v)/4096)*3.3
            tr_disp_v = '%.3f' % get_v
            #print(tr_disp_v)
            label_v["text"] = "电压值:" + tr_disp_v + 'V'

总的文件请移步这篇帖子进入查看:【新提醒】【飞凌RK3568开发板试用体验】CAN电压检测系统 - 飞凌嵌入式 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 ! (elecfans.com)
实现效果:
image.png

CAN电压检测系统

更多回帖

发帖
×
20
完善资料,
赚取积分