当前位置:网站首页>STM32__06—单通道ADC
STM32__06—单通道ADC
2022-07-05 23:09:00 【c语言的神】
一,ADC(模数转化)
STM32芯片集成了12位逐次逼近型ADC模块,什么是逐次逼近型,简单来说就是内置了一个DAC模块用于输出一个电压与输入电压进行二分比较,通过DAC的数字量来确定输入电压的数值量。输入电压范围为0~3.3,对应数字量0~4095。我使用的是103c8t6,有2个ADC模块,分别为ADC1与ADC2,每个ADC模块有10个通道。接下来是对下面ADC模块进行简单的介绍。
我把本节所要学习的部分,分成3个模块为
1,输入模块
输入引脚对于的IO口可以参考下图,该引脚应用图来自江科大
这张图很重要,后面会多次用到。输入模块的配置比较简单配置成GPIO_Mode_AIN(GPIO的模拟输入模式)
2,连接通道模块
这一部分主要是配置输入通道,顺序,转化周期。
同时涉及到模式选择:注入模式与规则模式
我们这里涉及到的是规则模式,简单解释一下就是把个个输入通道排序,然后按照一定的规则进行转化有单次转化,连续转化,扫描转化,非扫描转化。具体功能参照数据手册。
3,ADC转换器模块(重点)
在使用ADC转换器是需要对预分频器进行设置,该预分频器是对72MHz的内部时钟进行分频
虽然可以进行/2,/4,/6,/8分频,但是ADCCLK最大只能14MHz,所以只能使用/6,/8分频。
触发源可以是定时器或者是软件。
在转换完成后的数值需要去寄存器读取,但是寄存器为16位,但是读取的数值为12位,这里需要对12位的数值进行右对齐处理。
二,代码部分
进行ADC的几个步骤,基本是按照上面那3大模块进行的编程
1,开启RCC,包括ADC与GPIO
2,GPIO初始化,配置为模拟输入模式
3,配置连接模块
4,ADC转换器
5,开启ADC
6,校准,减少误差
校准不需要深入了解,知道怎么校准就可以了。
AD.c
#include "stm32f10x.h" // Device header
void AD_Init(void)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//选择规则组的输入通道
//初始化ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//选择独立工作模式
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据对齐方式:右对齐
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//外部触发源选择软件触发
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转换模式或者单次模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;// 扫描模式或者非扫描模式
ADC_InitStructure.ADC_NbrOfChannel=1;//通道数目1~16;
ADC_Init(ADC1,&ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADCCLK 6分频 72/6=12MHz
//开启ADC
ADC_Cmd(ADC1,ENABLE);
//校准
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//等待复位校准完成
ADC_StartCalibration(ADC1);//开始校准
while(ADC_GetCalibrationStatus(ADC1)==SET);//等待校准完成
}
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//规则组或注入组转换完成标志位
return ADC_GetConversionValue(ADC1);
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "Buzzer.h"
#include "OLED.h "
#include "AD.h"
uint16_t ADValue;
float Volatge;
int main()
{
OLED_Init();
AD_Init();
OLED_ShowString(1,1,"ADValue");
OLED_ShowString(2,1,"Volatge:0.00V");
while(1)
{
ADValue = AD_GetValue();
Volatge = (float)ADValue / 1241;
OLED_ShowNum(1,9,ADValue,4);
OLED_ShowNum(2,9,Volatge,1);//显示整数的部分
OLED_ShowNum(2,11,(uint16_t)(Volatge*100)%100,2);
Delay_ms(100);
}
}
三,总结
32算是小入门了,学起来轻松了不少。过几天更新电赛单片机MSP430。
边栏推荐
- (4) UART application design and simulation verification 2 - RX module design (stateless machine)
- Code farmers to improve productivity
- Object detection based on impulse neural network
- Use of metadata in golang grpc
- Registration and skills of hoisting machinery command examination in 2022
- Spécifications techniques et lignes directrices pour la sélection des tubes TVS et ESD - Recommandation de jialichuang
- Using LNMP to build WordPress sites
- 《牛客刷verilog》Part III Verilog企业真题
- JVM的简介
- 判斷二叉樹是否為完全二叉樹
猜你喜欢
Live tiktok shop 2022 latest gameplay card slot overseas live e-commerce new traffic
YML configuration, binding and injection, verification, unit of bean
Basic knowledge of database (interview)
14种神笔记方法,只需选择1招,让你的学习和工作效率提高100倍!
无刷驱动设计——浅谈MOS驱动电路
芯源&立创EDA训练营——无刷电机驱动
【原创】程序员团队管理的核心是什么?
Object detection based on impulse neural network
Dynamic memory management (malloc/calloc/realloc)
Scala concurrent programming (II) akka
随机推荐
Getting started stm32--gpio (running lantern) (nanny level)
424. 替换后的最长重复字符 ●●
Multi view 3D reconstruction
Go语言实现原理——Map实现原理
Multi sensor fusion of imu/ electronic compass / wheel encoder (Kalman filter)
Attacking technology Er - Automation
golang代码检查工具
VS2010 writes DLL and unit test of dynamic link library, and transfers the correctness of DLL test
MySQL (2) -- simple query, conditional query
How to insert data into MySQL database- How can I insert data into a MySQL database?
698. Divided into k equal subsets ●●
【原创】程序员团队管理的核心是什么?
Common static methods of math class
Week 17 homework
Go language implementation principle -- map implementation principle
成为程序员的你,后悔了吗?
TVS管和ESD管的技術指標和選型指南-嘉立創推薦
《牛客刷verilog》Part III Verilog企业真题
Pyqt control part (I)
数据库基础知识(面试)