概述
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、ADC原理
- 二、使用步骤
- 1.引入库
- 总结
前言
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
–
一、ADC原理
ADC的结构和原理有很多种,在这里主要介绍一下逐次积分型ADC
1.STM32F103 系列 MCU 提供了 12 位 ADC 外设, 它有多达 18 个通道, 可测量 16 个外部和 2 个内部信号源。 各通道的 A/D 转换可以单次、 连续、 扫描或间断模式执行。 ADC
的结果可以按左对齐或右对齐方式存储在 16 位数据寄存器中。
2.stm32时钟树
3.
二、使用步骤
1.引入库
ADC.C代码如下(示例):
#include "stm32f10x.h"
#include "user_adc.h"
#include "delay.h"
volatile unsigned int ADC_Buf[NUMSAMP+1]; //放单片机ADC采集原始值
volatile unsigned int ADC_BufCnt=0; //采集量变量
/**************************************************************************************
* 描 述 : 初始化ADC1
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE); //使能ADC1用时钟和PB口时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子为6,ADCCLK=PCLK2/6
//配置PB0为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件控制ADC转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //转换ADC通道的数目为1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_DMACmd(ADC1,DISABLE); //失能ADC1的DMA请求
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE); //使能ADC1中断
ADC_Cmd(ADC1,ENABLE); // 使能ADC1
ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC的校准程序
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC_Group:先占优先级2位,从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //配置为ADC1_2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //先占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
}
/**************************************************************************************
* 描 述 : 启动指定的ADC通道开始AD转换
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void StartADC(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); //开通通道8,即PB0
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE); //使能ADC1中断
ADC_Cmd(ADC1,ENABLE); //把ADC从断电模式下唤醒
sw_delay_ms(1); //在转换器上电至转换开始有一个延时tSTAB
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发ADC转换
}
/**************************************************************************************
* 描 述 : 关闭ADC1
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void StopADC(void)
{
ADC_ITConfig(ADC1, ADC_IT_EOC,DISABLE); //关闭ADC1中断
ADC_Cmd(ADC1,DISABLE); // 关闭ADC1
}
/**************************************************************************************
* 描 述 : ADC1中断服务函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void ADC1_2_IRQHandler(void)
{
unsigned int adcPtr;
if(ADC_GetITStatus(ADC1,ADC_IT_EOC) ==SET) //检查指定的ADC中断是否发生
{
adcPtr=ADC_GetConversionValue(ADC1); //读取ADC1转换值
ADC_Buf[ADC_BufCnt++]=adcPtr; //将读取的ADC1转换值存入指定数组
if(ADC_BufCnt==NUMSAMP) //指定数量的ADC1信息采集结束
{
ADC_BufCnt=0; //清零采集量变量值
}
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC); //清除ADC1中的中断待处理位
}
}
/**************************************************************************************
* 描 述 : 电压采集处理函数
* 入 参 : 无
* 返回值 : 单位为mV的电压值
**************************************************************************************/
float HandleADCTemp(void)
{
unsigned long val=0;
unsigned int Temp_signal;
unsigned int i;
float g_temperature;
//软件过滤采集的原始值的前NUMHEAD和最后NUMHEAD个数据,将剩余数据累加
for(i=NUMHEAD;i<(NUMSAMP-NUMHEAD);i++)
{
val=val+ADC_Buf[i];
}
//对采集的累加值求平均
Temp_signal=val/(NUMSAMP-2*NUMHEAD);
//如果想显示电压值可按照公式:V=Temp_signal/4096*3.3;进行计算。(下面算法得出电压值单位是mV)
g_temperature=Temp_signal*1000/4096*3.3;
//返回实测电压值
return g_temperature;
}
/*************************************END OF FILE******************************/
ADC.H代码如下(示例):
#include "stm32f10x.h"
#include <math.h>
#define NUMSAMP 640
#define NUMHEAD 40
#define TEMPMAX 4090
#define TEMPMIN 0
extern void ADC1_Init(void);
extern void StartADC(void);
extern void StopADC(void);
extern float HandleADCTemp(void);
可以通过串口或者oled实时显示数据
总结
以上就是今天要讲的内容,本文简单介绍了ADC的使用。
最后
以上就是碧蓝夕阳为你收集整理的ADC原理及ADC读取电压值实例前言一、ADC原理二、使用步骤总结的全部内容,希望文章能够帮你解决ADC原理及ADC读取电压值实例前言一、ADC原理二、使用步骤总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复