RA6M4内置有12 位 ADC,并提供了多个检测通道可以使用,由J2接口即可输入检测的模拟信号。

图1 J2接口
有了硬件的支持,要实现相应的功能,就需要以RASC进行引脚的配置,并生成KEIL工程代码,其步骤为:
取消其它通道的采集,只保留AN000的采集,所用引脚为P000,见图2所示。

图2单通道采集
加入一个ADC入栈以开启引脚P000 的电压检测功能,见图3所示。然后,按图3所示来配置参数。

图3 加入ADC

图4 配置参数
点击“Generate Project Content”按钮,以生成配置代码。
在生成代码后,以KEIL打开所生成的工程,并主程序的文件中添加以下内容:
volatile uint8_t ADC0_Busy;
void adc0_callback(adc_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
ADC0_Busy = 0;
}
void ADC0_Init(void)
{
fsp_err_t err;
ADC0_Busy = 0;
}
void ADC0_Convert(uint8_t channel)
{
fsp_err_t err;
FSP_PARAMETER_NOT_USED(channel);
}
uint16_t ADC0_GetValue(uint8_t channel)
{
fsp_err_t err;
uint16_t ret;
err = R_ADC_Read(&g_adc0_ctrl, (adc_channel_t)channel, &ret);assert(FSP_SUCCESS == err);
return ret;
}
在配有串口打印功能的情况下,将主程序修改成如下内容:
void hal_entry(void)
{
uint16_t u;
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
printf("A/D test : \r\n");
ADC0_Init();
while(1)
{
ADC0_Convert(ADC_CHANNEL_0);
u=ADC0_GetValue(ADC_CHANNEL_0);
printf("CHANNEL_0:%d \r\n",u);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_HIGH);
}
}
经程序的编译和下载,其测试效果如图5所示,说明数据采集有效。

图5 测试效果
在添加双色OLED屏的情况下,并以I2C接口进行连接。

图6 I2C接口
在RASC中,重新完成引脚的添加与配置后,在KEIL中为模拟I2C输出高低电平,其语句定义为:
#define OLED_SCLK_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_HIGH)
#define OLED_SDIN_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_HIGH)
#define OLED_SCLK_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_LOW)
#define OLED_SDIN_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_01_PIN_01, BSP_IO_LEVEL_LOW)
随后,再完成OLED屏的驱动程序添加,即可实现采集数据的显示效果,相应的主程序为:
void hal_entry(void)
{
uint16_t u;
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
printf("A/C test : \r\n");
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"RA-Eco-RA6M4",16);
OLED_ShowString(0,2,"ch0:",16);ADC0_Init();
while(1)
{
ADC0_Convert(ADC_CHANNEL_0);
u=ADC0_GetValue(ADC_CHANNEL_0);
printf("CHANNEL_0:%d \r\n",u);
OLED_ShowNum(40,2,u,4,16);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_LOW);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_10, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_11, BSP_IO_LEVEL_HIGH);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_14, BSP_IO_LEVEL_HIGH);
}
}
经程序的编译和下载,其测试效果如图7所示,说明设计正确。

图7 显示效果
演示视频: