RA生态之ADC 采样

ADC 配置

点击 Stacks->New Stack-> Analog -> ADC r_adc

先是单通道ADC

默认12位ADC精度,对齐方式扫描(也最常见的方式)

下图是设置回调函数adc_callback,和回调中断优先级为2

 在PIN那里选择通道

R_ADC_Open()函数:开启和初始化 ADC 模式(在这里是开启adc0)

/* Initializes the module. */
err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);

 R_ADC_ScanCfg()函数: 配置 ADC 扫描参数,赋能 ADC 通道(在这里是赋能adc的通道0)

/* Enable channels. */
err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);

 R_ADC_ScanStart()函数:启动扫描,若设置为单次扫描,没扫描完一次都需要重新开启

/* Enable scan triggering from ELC events. */
(void) R_ADC_ScanStart(&g_adc0_ctrl);

 回调函数 adc_callback ()(名字是自己定义的):学过51都知道中断吧,差不多的意思

volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{
        FSP_PARAMETER_NOT_USED(p_args);
        scan_complete_flag = true;
}

 故需要在扫描时候在主程序中等待其扫描完毕

scan_complete_flag = false;
while (!scan_complete_flag)
{
        /* Wait for callback to set flag. */
}

 R_ADC_Read()函数:读取单个通道的 ADC 值

err =R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data1);
assert(FSP_SUCCESS == err);
a1=(double)(adc_data1/4095.0)*3.3;

 示例代码:

double a0;
uint16_t adc_data1=0;
volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{
        FSP_PARAMETER_NOT_USED(p_args);
        scan_complete_flag = true;
}
void hal_entry(void)
{
        /* TODO: add your own code here */
        fsp_err_t err = FSP_SUCCESS;
        /* Initializes the module. */
        err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
        /* Handle any errors. This function should be defined by the user. */
        assert(FSP_SUCCESS == err);
        /* Enable channels. */
        err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
        assert(FSP_SUCCESS == err);
while(1)
{
        /* Enable scan triggering from ELC events. */
        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_0, &adc_data1);
        assert(FSP_SUCCESS == err);
        a0=(adc_data1/4095.0)*3.3;
        R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

 

现象:可读取通道 0(P000)电压值a0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值