查看: 590|回复: 1

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

[复制链接]

116

主题

133

帖子

3768

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3768
发表于 2023-2-2 15:17:58 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】CAN网络电压采集系统
作者:lugl

电压采集后,除了利用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发送数据函数:

  1. void can_send_v(uint16_t data)
  2. {
  3.   fsp_err_t err = FSP_SUCCESS;
  4.   uint32_t time_out = WAIT_TIME;                                      // time out
  5.   uint8_t can_tx_msg[8] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   
  6.   uint8_t can_rx_msg[8] =  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};     
  7.   /* Initialize CAN module */
  8.     err = R_CAN_Open(&g_can0_ctrl, &g_can0_cfg);
  9.     /* Error trap */
  10.     if(FSP_SUCCESS != err)
  11.     {
  12.         printf("\r\nCAN Open API failed");
  13.     }

  14.     g_can_tx_frame.id = 0x001;
  15.     g_can_tx_frame.type = CAN_FRAME_TYPE_DATA;
  16.     g_can_tx_frame.data_length_code = 8;
  17.    
  18.     /* copy the tx data frame with TX_MSG */
  19.     g_can_tx_frame.data[0] = (uint8_t)(data>>8);
  20.     g_can_tx_frame.data[1] = (uint8_t)data;
  21.     //memcpy((uint8_t*)&g_can_tx_frame.data[ZERO], (uint8_t*)&can_tx_msg[ZERO], CAN_FRAME_TRANSMIT_DATA_BYTES);
  22.    
  23.     err = R_CAN_Write(&g_can0_ctrl, CAN_MAILBOX_NUMBER_0, &g_can_tx_frame);
  24.      if (FSP_SUCCESS != err)
  25.       {
  26.           printf("\r\n CAN Write API FAILED");
  27.           can_deinit();
  28.       }

  29.       /* wait for transmit flag bit to set */
  30.       while ((true != b_can_tx) && (--time_out));
  31.       if (RESET_VALUE == time_out)
  32.       {
  33.           printf("CAN transmission failed due to timeout");
  34.       }
  35.       /* Reset flag bit */
  36.       b_can_tx = false;
  37.   
  38. }
复制代码
传入参数为16位无符号整数,刚好为ADC采样的电压值。
修改adc采样函数如下:
  1. void read_adc(void)
  2. {
  3.   fsp_err_t err = FSP_SUCCESS;
  4.   double a0;
  5.   uint16_t adc_data0=0;
  6.   char vbuf[10];
  7.   (void) R_ADC_ScanStart(&g_adc0_ctrl);
  8.    scan_complete_flag = false;
  9.   while (!scan_complete_flag)
  10.   {
  11.       /* Wait for callback to set flag. */
  12.   }
  13.   
  14.   err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_2, &adc_data0);
  15.   assert(FSP_SUCCESS == err);
  16.   a0=(double)(adc_data0/4095.0)*3.3;
  17.   printf("v: %.03f \r\n",a0);
  18.   sprintf(vbuf,"%.03fV",a0);
  19.   OLED_ShowString(24,24,vbuf,24);
  20.   can_send_v(adc_data0);//这里用于CAN发送数据出去。
  21. }
复制代码
在飞凌OK开发板上,对数据进行解析:
  1. if id == 0x001:
  2.             get_v = int(msg.data[0]) * 256 + int(msg.data[1])
  3.             get_v =(float(get_v)/4096)*3.3
  4.             tr_disp_v = '%.3f' % get_v
  5.             #print(tr_disp_v)
  6.             label_v["text"] = "电压值:" + tr_disp_v + 'V'
复制代码
总的文件请移步这篇帖子进入查看:[color=rgb(12, 147, 228) !important]【新提醒】【飞凌RK3568开发板试用体验】CAN电压检测系统 - 飞凌嵌入式 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
实现效果:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

195

帖子

1281

积分

金牌会员

Rank: 6Rank: 6

积分
1281
发表于 2023-3-14 11:11:12 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:133精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 39帖子:127精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表