赞
踩
配置项 | 参数 |
---|---|
ADC_Seting ADC设置 | |
Clock Prescaler(时钟预分频) | 1、Asynchronous clock mode(异步时钟模式) 2、Synchronous clock mode divided by 2(同步时钟模式2分频) 2、Synchronous clock mode divided by 4 (同步时钟模式4分频) |
Resolution(分辨率) | 1、ADC 12-bit resolution(12位分辨率) 2、ADC 10-bit resolution(10位分辨率) 3、ADC 8-bit resolution(8位分辨率) 4、ADC 6-bit resolution(6位分辨率) |
Data Alignment(数据对齐) | 1、Right alignment (右对齐) 2、Left alignment(左对齐) |
Scan Conversion Mode(扫描转换模式) | 1、Forward (从前往后) 2、Backward(从后往前) |
Continuous Conversion Mode(连续转换模式) | 1、Disabled 2、Enable |
Discontinuous Conversion Mode(非连续转换模式) | 1、Disabled 2、Enable |
DMA Continuous Reqursts(DMA转换请求) | 1、Disabled 2、Enable |
End Of Conversion Selection(转换选择结束) | 1、End of single conversion(单次转换结束) 2、End of sequence of converslon (顺序转换结束) |
Overrun behaviour(数据溢出) | 1、Overrun data preserved(保存溢出数据) 2、Overrun data overwritten(覆盖溢出数据) |
Low Power Auto Wait(低功耗自动等待) | 1、Disabled 2、Enable |
Low Power Auto Power Off(低功耗自动关机) | 1、Disabled 2、Enable |
ADC Regular ConversionMode ADC规则转换模式 | |
Sampling Time(采样时间) | 1、1.5 Cycles 2、7.5 Cycles 3、13.5 Cycles 4、28.5 Cycles 5、41.5 Cycles 6、55.5 Cycles 7、71.5 Cycles 8、239.5 Cycles |
External Trigger Conversion Source(外部触发源) | 1、Reqular Conversion launched by software(由软件启动的规则转换) 2、Timer 1 Trigger Out event(定时器1触发输出事件) 3、Timer 1 Capture Compare 4 event(定时器1捕获比较4事件) 3、Timer 2 Trigger Out event(定时器2触发输出事件) 4、Timer 3 Trigger Out event(定时器3触发输出事件) |
External Trigger Conversion Edge(外部触发源边沿) | 1、Trigger detection on the rising edge(上升沿触发检测) 2、Trigger detection on the falling edge(下升沿触发检测) 3、Trigger detection on the rising and fallings edge(在上升和下降沿触发检测) |
WatchDog 看门狗 | |
Enable Analog WatchDog Mode(开启模拟看门狗模式) | |
Low Threshold(低阈值) |
Scan Conversion Mode是指STM32微控制器内部模数转换器(ADC)的一种工作模式,这种模式特别适用于需要依次采集多个模拟输入通道的情形。
在Scan Conversion Mode下,ADC能够按照预先设定的顺序连续或循环地转换多个通道的输入信号。具体来说:
通过结合Scan Conversion Mode和Continuous Conversion Mode,开发者可以根据实际应用需求实现对多个模拟信号的同时监测或者周期性采样。通常配合DMA(直接内存访问)传输功能可以更高效地获取并处理转换后的数据,避免在转换过程中丢失数据。
和采样的精准度有关系
“End Of Conversion Selection”(EOC Selection,转换结束选择)是一个与ADC模数转换过程相关的配置选项。这个选项用于决定何时产生一个ADC转换结束事件(EOC,End Of Conversion)信号。
ADC在完成一次模拟信号到数字信号的转换后,会生成一个EOC标志位或中断请求信号。End Of Conversion Selection允许你选择是在每个通道转换结束后还是在一个序列(即多个通道顺序转换完成后)结束时触发EOC信号。
根据应用的具体需求,可以通过相应的寄存器配置来选择EOC事件触发的时机,以便正确地读取数据或执行后续处理操作。
Overrun behavior(溢出行为)特指在ADC连续转换或扫描转换期间,当一个新的转换结果被存储到数据寄存器(通常是ADC_DR)时,如果前面的转换结果还没有被读取,则会发生ADC数据溢出。
具体来说,在ADC连续工作模式下,如果连续不断地进行模数转换并且没有及时将转换结果读取至CPU缓存或通过DMA(直接内存访问)传输到指定内存区域,当新的转换结果准备写入ADC数据寄存器时,先前未读取的结果将会被新数据覆盖,这就发生了Overrun情况。
在STM32F031的ADC模块中,一旦发生Overrun,相关的 overrun 标志位(如ADC_SR中的OVR标志)会被硬件自动置位,表明发生了数据溢出事件。为了防止数据丢失和正确处理这种情况,应用程序应当定期检查这个标志位,并采取适当措施(如立即读取和处理ADC数据,或通过DMA方式自动传输数据)来避免连续的Overrun事件发生。同时,在每次读取ADC数据之前,通常需要清除Overrun标志以确认并处理这一事件。
配置采样通道 AN0
/**
* @brief 获取ADC的采样结果
* @param 无
* @retval uint16_t ADC_Value;
*/
uint16_t drv_adc_get_value(void)
{
uint16_t ADC_Value;
HAL_ADC_Start(&hadc); //开启ADC,开启常规组转换
HAL_ADC_PollForConversion(&hadc,50); //等待常规组转换完成。
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC)) //判断通道转换已完成 HAL_ADC_STATE_REG_EOC是否为1
{
ADC_Value = HAL_ADC_GetValue(&hadc);
}
return ADC_Value;
}
uint16_t sample_ch0_value;
void user_1ms_Task(void)
{
sample_ch0_value = drv_adc_get_value();
}
配置采样通道 AN0、AN1、AN4、AN5
/**
* @brief 获取ADC的采样结果
* @param 无
* @retval uint16_t ADC_Value;
*/
uint16_t drv_adc_get_value(void)
{
uint16_t ADC_Value;
HAL_ADC_Start(&hadc); //开启ADC,开启常规组转换
HAL_ADC_PollForConversion(&hadc,50); //等待常规组转换完成。
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC)) //判断通道转换已完成 HAL_ADC_STATE_REG_EOC是否为1
{
ADC_Value = HAL_ADC_GetValue(&hadc);
}
return ADC_Value;
}
uint16_t sample_value[4];
void user_100ms_Task(void)
{
static uint8_t i;
for(i=0;i<4;i++)
{
sample_value[i] = drv_adc_get_value();
}
HAL_ADC_Stop (&hadc);
}
勾选ADC中断使能
配置采样通道 AN0
ADC中断的回调函数代码
uint16_t adc_value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc_t)
{
if(hadc_t == &hadc)
{
uint16_t adc_value = HAL_ADC_GetValue(hadc_t);
printf("refresh adc value:%1.3fV\r\n", adc_value*3.3/4096.0);
HAL_ADC_Start_IT(&hadc); // 重新开启ADC中断
}
}
主函数main
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */
HAL_ADC_Start_IT(&hadc);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
user_main_Task();
}
/* USER CODE END 3 */
}
配置采样通道 AN0、AN1、AN4、AN5
uint16_t adc_dma_address_value[4] = {0};
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_ADCEx_Calibration_Start(&hadc);
HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_dma_address_value, 4);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("-------------------- \r\n");
printf("adc value[0]:%1.3fV \r\n", adc_dma_address_value[0]/4096.0*3.3);
printf("adc value[1]:%1.3fV \r\n", adc_dma_address_value[1]/4096.0*3.3);
printf("adc value[2]:%1.3fV \r\n", adc_dma_address_value[2]/4096.0*3.3);
printf("adc value[3]:%1.3fV \r\n", adc_dma_address_value[3]/4096.0*3.3);
}
/* USER CODE END 3 */
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。