我是靠谱客的博主 独特芝麻,这篇文章主要介绍STM32单片机ADC采集STM32单片机ADC采集reference,现在分享给大家,希望可以做个参考。

STM32单片机ADC采集

  • STM32单片机ADC采集
  • reference

STM32单片机ADC采集

模拟信号:电压值随着时间是连续变化的
优点:可以精确地表示事物变化的过程,缺点:容易受到噪声的干扰,有误差
数字信号:抗干扰能力强
在这里插入图片描述
采样频率:
在这里插入图片描述
ADC精度:
在这里插入图片描述
在这里插入图片描述
工程项目结构:
其中画红色方框部分为重要函数实现功能
在这里插入图片描述
ADC.c:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "ADC/ADC.h" #include "DELAY/Delay.h" /** * 功能:初始化ADC1_IN9 * 参数:None * 返回值:None */ void initADC(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体 ADC_InitTypeDef ADC_InitStructure; //定义ADC初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能外设时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //重映射JTAG引脚,只使用SWD模式 RCC_ADCCLKConfig(RCC_PCLK2_Div8); //设置ADC时钟分频,此时ADC时钟频率为72/8=9MHz /*********************配置PB1***************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOB, &GPIO_InitStructure); /************************************************************************** * 开发板上PA15上电默认是JTAG的JTDI引脚,为上拉输出,这会导致冷光灯亮起,影响ADC采集效果 * 因此要将PA15重映射到该引脚上 **************************************************************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //设置对应引脚 GPIO_Init(GPIOA, &GPIO_InitStructure); //设置生效 GPIO_ResetBits(GPIOA, GPIO_Pin_15); //默认低电平 /*********************配置ADC***************************/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //配置为独立工作模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //设置ADC工作在单通道 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //设置ADC为单次转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //失能外部触发,使用软件人为触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //设置ADC数据寄存器右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //规则转换通道数,我们只使用一个 ADC_Init(ADC1, &ADC_InitStructure); //生效ADC设置 ADC_Cmd(ADC1, ENABLE); //设置ADC_CR2中的ADON位,使其给ADC1上电 /********************************************************************* * 1. 配置ADCx规则转换的通道以及转换序列 * 2. 配置转换序列,因为我们只用到了一个通道,因此转换序列要设置为1 * 3. 设置ADCx的采样周期 *********************************************************************/ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_239Cycles5); ADC_ResetCalibration(ADC1); //复位ADC1校准 while (ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准完成 ADC_StartCalibration(ADC1); //开始ADC1的校准 while (ADC_GetCalibrationStatus(ADC1)); //等待校准完成 } /** * 功能:获取ADC1_IN9单次AD转换结果 * 参数:None * 返回值:None */ u16 getConvValue(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开启软件转换,置位ADC_CR2的SWSTART位 while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成 return ADC_GetConversionValue(ADC1); //获取ADC转换结果 } /** * 功能:获取ADC1_IN9多次转换平均值 * 参数:counts:采集次数 * xus:每次采集的时间间隔,单位为us,建议时间不要太长 * 返回值:多次平均采集结果 */ u16 getConvValueAve(u8 counts, u32 xus) { u8 i; u32 sum = 0; //累加值临时存放变量 for (i = 0; i < counts; ++i) { sum += getConvValue(); //采样结果累加 Delay_us(xus); } return sum / counts; //取平均值并返回 }

main.c:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h> #include "DELAY/Delay.h" #include "UART/uart.h" #include "ADC/ADC.h" #include "LED/LED.h" int main(void) { /*各外设初始化*/ initADC(); initUART(); initLED(); initSysTick(); while (1) { // getConvValueAve(5,10000):采集5次,每次采集10ms共50ms printf("Lux is %dn",getConvValueAve(5,10000)); //采集周期50ms toggleLED(); Delay_ms(800);//800ms刷新一次 } }

reference

  • 1.STM32单片机ADC采集
  • 2.STM32CUBEIDE(10)----ADC在DMA模式下扫描多个通道

最后

以上就是独特芝麻最近收集整理的关于STM32单片机ADC采集STM32单片机ADC采集reference的全部内容,更多相关STM32单片机ADC采集STM32单片机ADC采集reference内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(111)

评论列表共有 0 条评论

立即
投稿
返回
顶部