RA4M2-SENSOR内置有12 位 ADC,并提供了多个检测通道。除了对外部信号进行采集,它还可以对内部得温度进行检测。
要实现相应的功能,就需要以RASC进行相应的配置,并生成KEIL工程代码,其步骤为:
添加一个ADC-DMAC入栈,此外还可添加串口入栈,见图1所示。

图1 添加ADC及串口入栈
选取通道0及片温检测通道,其配置见图2合图3所示。

图2 选取通道及配置

图3 配置DMAC
在生成代码后,以KEIL打开所生成的工程,并在主程序的文件中添加相应的代码,完成后的内容为:
void g_transfer1_callback(transfer_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
dmac_complete_flag = 1;
}
void ADC_DMA_Init(void)
{
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(err == FSP_SUCCESS);
err = R_ADC_ScanCfg(&g_adc0_ctrl,&g_adc0_channel_cfg);
assert(err == FSP_SUCCESS);
g_transfer1_cfg.p_info->p_dest = adc_buffer;
err = R_DMAC_Open(&g_transfer1_ctrl,&g_transfer1_cfg);
assert(err == FSP_SUCCESS);
err = R_DMAC_Enable(&g_transfer1_ctrl);
assert(err == FSP_SUCCESS);
}
void ADC_DMA_Test(void)
{
uint16_t p;
adc_info_t adc_info;
err = R_ADC_ScanStart(&g_adc0_ctrl);
assert(err == FSP_SUCCESS);
while(!dmac_complete_flag);
dmac_complete_flag = 0;
err = R_DMAC_Reconfigure(&g_transfer1_ctrl,g_transfer1_cfg.p_info);
assert(err == FSP_SUCCESS);
err = R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
assert(err == FSP_SUCCESS);
float V = (3.3 * (float)adc_buffer[0]) / 4096 ;
printf("channel_0: %.2f V \n\r",V);
float V1 = (3.3 * (float)adc_info.calibration_data) / 4096 ;
float Vs = (3.3 * (float)adc_buffer[1] ) / 4096 ;
float temperature = ( Vs - V1 ) / ( 4.0/1000 ) + 127.0f;
printf("temperatur: %.2f C \n\r",temperature);
}
在配有串口通讯的情况下,实现A/D数据采集的主程序为:
void hal_entry(void)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 3);
assert(FSP_SUCCESS == err);
printf("A/D test : \r\n");
ADC_DMA_Init();
while(1)
{
ADC_DMA_Test();
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
}
经程序的编译和下载,其测试效果如图4所示,说明数据采集有效。

图4 测试结果
在添加OLED屏显示的情况下,其测试效果如图6至图8所示。

图5 连接OLED显示屏

图6 检测GND

图7 悬空状态

图8 检测VCC
|