简介
前一段时间买了一个固态硬盘盒用来给MAC外接。 但是发现它有时候温度又实在有一点高。所以是一定需要一个风扇来给他散热的。 于是买了两个NTC的电阻。本次将通过配置ADC来读取3.3经过NTC后的值(因为没有加外部电阻,所以没办法获取到温度)
ADC配置步骤
1- 在FSP里结合对应的PIN和原理图和ADC的引脚配置对应的外设
我这里选择的是P004, 因为可以直接接NTC
2- 在PIN配置中开启ADC
3- 新建一个stack , 选择ADC
4- 配置ADC的详细属性参数
通用的ADC配置, 可以保持默认, 在input中开启通道4的输入。
配置ADC的中断和中断优先级,然后检查对应的pin是否使能。接着就是生成project。
5- 根据配置的回调函数名称写我们自己的回调函数。 其主要作用是判断ADC是否转换完成。
volatile bool scanned = false;
void adc0_callback(adc_callback_args_t *p_args)
{
scanned = true;
}
6- 初始化ADC
void init_adc()
{
fsp_err_t status = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
assert(FSP_SUCCESS == status);
printf("Init ADC successful!\r\n");
status = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
assert(FSP_SUCCESS == status);
printf("ADC SCAN successful!\r\n");
}
上面的代码我踩坑了两三天。 因为我ADC之前都只是打开了,但是并没有调用ScanCfg函数来进行配置。 所以每次扫描出来的都是0
7- 在主函数中来进行ADC的读取和转换
void hal_entry(void)
{
init_usart();
init_adc();
uint16_t adc_value = 0;
fsp_err_t status = FSP_SUCCESS;
while(1)
{
R_ADC_ScanStart(&g_adc0_ctrl);
scanned = false;
while(!scanned);
status = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_4, &adc_value);
assert(FSP_SUCCESS == status);
printf("ADC Value: %u\r\n", adc_value);
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
}
}
8- 然后将代码烧录的单片机中, 上述的主要逻辑为首先配置好ADC, 然后再while中触发转换,然后更新adc转换的标志, 从而等待在中断中对ADC的中断标志位进行重置即代表转换完成。然后遍可以通过串口打印出去了。