2018/5/11
stm32
1.说在前面:抽空学点32的内置外设
2.ADC功能的简单实现(单个通道的x次转化)
注:ADC:将连续变换的模拟量变为可视的数字量
库函数实现ADC对外部电压的测量(注:电压需小于3.3v,否则可能烧坏ADC)
过程:
1.开启ADC1和PA口时钟,设置PA1为模拟输入(通过PA1测试外部的电压)
2.复位ADC1,同时设置ADC1分频因子(注意等待复位以及频率要小于14MHZ)
3.初始化ADC1参数,设置ADC1的工作模式和规则序列
4.使能ADC 校准
5.读取ADC的值
相关代码:
#include"adc.h"
#include"delay.h"
//ADC
//将连续变换的模拟量转换为可视的数字量
//实现通过ADC1测试电压
//1.开启ADC1和PA口时钟,设置PA1为模拟输入(通过PA1测试外部的电压)
//2.复位ADC1,同时设置ADC1分频因子
//3.初始化ADC1参数,设置ADC1的工作模式和规则序列
//4.使能ADC 校准
//5.读取ADC的值
void Adc_Init()
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//实现GPIOA口和ADC1口的时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
//设置分频因子(不能超过14HZ)
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置分屏系数为6
//设置PA1为模拟输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置口为P1^1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化函数
//复位PA1的值
ADC_DeInit(ADC1);//复位ADC1,将ADC1的值设置为缺省值
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//设置为独立模式
//ADC实现单个通道的x次转换
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//设计ADC为单通道模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不由外界启动(软件启动)
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//设置为右对齐
//规则转换方面的设置
ADC_InitStructure.ADC_NbrOfChannel=1;//设置转换的通道数目
ADC_Init(ADC1,&ADC_InitStructure);//设置为ADC1
//使能ADC1
ADC_Cmd(ADC1,ENABLE);
//开启复位校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开启校准
while(ADC_GetCalibrationStatus(ADC1));//等待复位校准结束
}
//获得值
u16 Get_Adc(u8 ch)
{
//设置规则组通道
//ADC1 采样时间为239.5个周期
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1软件转换(前面设置的不为硬件转换)
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
//返回最近一次ADC1规则组的转换结果
//实现数值的读取
return ADC_GetConversionValue(ADC1);
}
//获得数值
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);//返回数据
delay_ms(5);
}
return times;//返回时刻(数组显示)
}
头文件:
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
#endif