一.ADC介绍和STM32F429芯片介绍
1.ADC介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
2.STM32F429芯片介绍
STM32属于一个微控制器,自带了各种常用通信接口,功能非常强大
1、串口一USART,用于跟跟串口接口的设备通信,比如:USB转串口模块、ESP8266 WIFI、GPS 模块,GSM模块,串口屏、指纹识别模块
2、内部集成电路一12C,用于跟I2C接口的设备通信,比如:EEPROM、电容屏、陀螺仪 MPU6050、0.96寸OLED 模块
3、串行通信接口一SPI,用于跟 SPI 接口的设备通信,比如:串行 FLASH、以太网 W5500、音频模块VS1053
4、SDIO、FSMC的超级、I2S、ADC、GPIO
5、STM32常用在嵌入式领域。
(1)智能车:循迹小车,读取光电传感器或者摄像头的数据,驱动电机前进和转弯。
(2)无人机:读取陀螺仪加速度计的姿态数据,根据控制算法控制电机速度,保证飞机稳定飞行。
(3)机器人:驱动舵机,控制其关节,让机器人运动。
(4)无线通信:给STM32连接一些2.4G无线模块或者蓝牙、WIFI模块,则具备无线通信能力。
(5)物联网:借助无线通信模块,再通过STM32驱动继电器来控制220v电路的通断。
(6)工业控制:PLC主控。
(7)娱乐电子产品:流水灯之类……
6、STM32功能强大、性能优异、片上资源丰富、功耗低、是一款经典的嵌入式微控制器。
二.ADC主要特征
(1) 12-位分辨率
(2)转换结束,注入转换结束和发生模拟看门狗事件时产生中断
(3)单次和连续转换模式
(4)从通道0到通道n的自动扫描模式
(5)自校准
(6)带内嵌数据一致的数据对齐
(7)通道之间采样间隔可编程
(8) 规则转换和注入转换均有外部触发选项
(9)间断模式
(10)双重模式(带2个或以上ADC的器件)
(11) ADC供电要求:2.4V到3.6V
(12)ADC输入范围:VREF- ≤ VIN ≤ VREF+
(13)规则通道转换期间有DMA请求产生。
三.电路原理图
四.具体操作
1. 建工程模板
(1)建两个新的.c和.h文件,gpio.init.c、gpio.init.h文件和delay.c、delay.h文件,步骤如下。
(1.1)点击file,选择第一个New.
(1.2)点击左上角保存,弹出一个窗口(注:保存在工程模板里的user),给text命名后保存
(1.3)相同步骤,创建.h文件
(1.4)创建好文件如图
(1.5)把下面文件下载复制到user里
usart文件链接
(1.6)把下载的usart文件和建好的.c和.h文件加入工程模板里,
(1.7)最后把.h文件也添加入工程模版,步骤如下
2.运行代码
(1)gpio.init.c文件的代码
#include "gpio.init.h"
static void ADC_GPIO_Config(void)//ADC管脚配置方式
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能gpio时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
//配置IO
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AN;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
static void ADC_CommonInit_Config(void)//ADC通用初始化
{
ADC_CommonInitTypeDef ADC_CommonInitStruct;
//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟
ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent ;//独立ADC模式
ADC_CommonInitStruct.ADC_Prescaler= ADC_Prescaler_Div2;//时钟为fpclk x分频
ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled ;//禁止DMA直接访问模式
ADC_CommonInitStruct.ADC_TwoSamplingDelay= ADC_TwoSamplingDelay_20Cycles;//采样时间间隔
ADC_CommonInit(&ADC_CommonInitStruct);
}
static void ADC_Init_Config(void)
{
ADC_InitTypeDef ADC_InitStruct;//创建结构体对象
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b;//ADC分辨率
ADC_InitStruct.ADC_ScanConvMode=DISABLE;//禁止扫描模式,多通道采集需要
ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;//连续转换
ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//禁止外部边缘触发
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1 ;//外部触发通道,
ADC_InitStruct.ADC_DataAlign= ADC_DataAlign_Right;//数据右对齐
ADC_InitStruct.ADC_NbrOfConversion=1;//转换通道1个
ADC_Init(ADC1, & ADC_InitStruct);
//配置ADC通道转换顺序为1,第一个转换,采样时间为3个时钟周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_56Cycles);
ADC_Cmd(ADC1,ENABLE);//使能ADC
ADC_SoftwareStartInjectedConv(ADC1);//开始adc转换,软件触发
}
//整合文件
void ADC_DMA_Init(void)
{
ADC_GPIO_Config();
ADC_CommonInit_Config();
ADC_Init_Config();
}
(2)gpio.init.h文件的代码
#include "stm32f4xx.h"
void ADC_DMA_Init(void);
(3)delay.c文件的代码
#include "delay.h"
void delay_ms(int a)
{
while(a--);
}
(4)delay.h文件的代码
#include "stm32f4xx.h"
void ADC_DMA_Init(void);
(5)主函数main的代码
#include "stm32f4xx.h"
#include "delay.h"
#include "gpio.init.h"
#include "./usart/bsp_debug_usart.h"
extern __IO uint16_t ADC_ConventedValue;
float ADC_Vol;
int main(void)
{
Debug_USART1_Config();
ADC_DMA_Init();
while(1)
{
ADC_ConventedValue=ADC_GetConversionValue(ADC1);
printf("\r\n The current AD value=0x%04X\r\n",ADC_ConventedValue);
printf("\r\n The current AD value=%fv\r\n",ADC_Vol);
ADC_Vol=(float ) ADC_ConventedValue/4096*(float)3.3;
delay_ms(55555555);
}
}