瑞萨单片机论坛
直播中

张鹏正

1年用户 52经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器
私信 关注
[经验]

【RA4M2-SENSOR】ADC多通道采集 DMAC转运

VID_20250903_090400

ADC两个通道采集电压,一路AIN0采集外部电位器,一路采集内部温度,并使用DMAC转运

image.png

添加 stack ADC-DMAC
image.png

配置扫描通道
image.png

设置ADC转换完成为DMAC触发源
设置中断回调函数

volatile int dmac_complete_flag = 0;
uint16_t adc_buffer[2];
void ADC_DMA_Init(void)
{
	fsp_err_t 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 g_transfer1_callback(transfer_callback_args_t * p_args)
{
	FSP_PARAMETER_NOT_USED(p_args);
	dmac_complete_flag = 1;
}

测试代码

void ADC_DMA_Test(void)
{
	fsp_err_t err;
	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("电位器采集电压:%.2f\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("芯片内部温度%.2f\n\r",temperature);

}

更多回帖

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