目录
1.连接
2.adc配置
3.主函数
1.连接
文章来源:https://uudwc.com/A/VNRdr
2.adc配置
#include "adc.h"
#include "delay.h"
//初始化ADC
void Adc_Init(void)
{
/*定义两个初始化要用的结构体,下面给每个结构体成员赋值*/
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*
使能GPIOA和ADC1通道时钟
注意:除了RCC_APB2PeriphClockCmd还有RCC_APB1PeriphClockCmd,那么该如何选择?
APB2:高速时钟,最高72MHz,主要负责AD输入,I/O,串口1,高级定时器TIM
APB1:低速时钟,最高36MHz,主要负责DA输出,串口2、3、4、5,普通定时器TIM,USB,IIC,CAN,SPI
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12, ADC的采样时钟最快14MHz
/*配置输入电压所用的PA0引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位,将ADC1相关的寄存器设为默认值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //工作模式:ADC1和ADC2独立工作模式 (还有其他什么模式?请看下面的附录图2)
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //数模转换工作:扫描(多通道)模式=ENABLE、单次(单通道)模式=DISABLE
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//数模转换工作:连续=ENABLE、单次=DISABLE
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC转换由软件触发启动 (还有其他什么模式?请看下面的附录图3)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 除了右就是左:ADC_DataAlign_Left
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 范围是1-16
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADC1的寄存器
ADC_RegularChannelConfig(ADC1, ADC_Channel_0|ADC_Channel_1|ADC_Channel_5|ADC_Channel_6|ADC_Channel_7|ADC_Channel_8|ADC_Channel_9, 1, ADC_SampleTime_239Cycles5 );//添加通道
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC 注意:函数ADC_Cmd只能在其他ADC设置函数之后被调用
/*下面4步按流程走,走完就行*/
ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待上一步操作完成
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1));//等待上一步操作按成
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)//
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次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 temp_val/times;
}
3.主函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
float tempa0,tempa1,tempa4,tempa5,tempa6,tempa7,tempb0,tempb1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
Adc_Init(); //ADC初始化
while(1)
{
tempa0=(float)Get_Adc_Average(ADC_Channel_0,10)*(3.3/4096);
tempa1=(float)Get_Adc_Average(ADC_Channel_1,10)*(3.3/4096);
tempa4=(float)Get_Adc_Average(ADC_Channel_4,10)*(3.3/4096);
tempa5=(float)Get_Adc_Average(ADC_Channel_5,10)*(3.3/4096);
tempa6=(float)Get_Adc_Average(ADC_Channel_6,10)*(3.3/4096);
tempa7=(float)Get_Adc_Average(ADC_Channel_7,10)*(3.3/4096);
tempb0=(float)Get_Adc_Average(ADC_Channel_8,10)*(3.3/4096);
tempb1=(float)Get_Adc_Average(ADC_Channel_9,10)*(3.3/4096);
printf("v0 %-4f v1 %-4f v2 %-4f v3 %-4f v4 %-4f v5 %-4f v6 %-4f v7 %-4f\r\n",tempa0,tempa1,tempa4,tempa5,tempa6,tempa7,tempb0,tempb1);
if(tempa0<3.15||tempa1<3.15||tempa4<3.15||tempa5<3.15||tempa6<3.15||tempa7<3.15||tempb0<3.15||tempb1<3.15)
LED0=!LED0;
delay_ms(1000);
}
}
文章来源地址https://uudwc.com/A/VNRdr