ckxckx实验7

adc.h

#ifndef __ADC_H
#define __ADC_H

#include "sys.h"

void Adc_Init(void);
u16 Get_Adc(u8 ch);//读取ch通道的ad转换结果
u16 Get_Adc_Average(u8 ch,u8 times);//读取ch通道的times次ad转换的平均值

#endif
 

adc,c

#include "adc.h"
#include "stm32f10x.h"
void Adc_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE); 
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //配置为模拟输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC的输入时钟是由PCLK2经分频产生的,不可超过14MHz,72M/6=12M     15.2.15
    
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式    4.2.2
    ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式,单通道模式用DISABLE
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次模式
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//采用软件触发的方式
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//对齐方式:转换结果右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1; //转换通道数1
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_Cmd(ADC1, ENABLE); //使能       4.2.4
    ADC_ResetCalibration(ADC1); //ADC的校准,ADC校准要先使能       4.2.7
    //while(ADC_GetResetCalibrationStatus(ADC1));//等待使能校准结束 注释:在protues中会卡死
    
    ADC_StartCalibration(ADC1);//开始校准    4.2.9
  //while( ADC_GetCalibrationStatus(ADC1));    //等待校准结束
}
u16 Get_Adc(u8 ch)//读取ch通道ad转换结果
{
    ADC_RegularChannelConfig(ADC1, ch, 1,ADC_SampleTime_239Cycles5); //配置转换参数
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开启一次规则转换
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束, ADC_FLAG_EOC 低电平有效
    return  ADC_GetConversionValue(ADC1);//读取转换的结果
}

u16 Get_Adc_Average(u8 ch,u8 times)//读取ch通道的times次ad转换的平均值
{
    int i;
    u16 temp=0;
    for(i=0;i<times;i++)
    {
        temp=temp+Get_Adc(ch);//转换结果累加,不能超过16次
    }
    
    return temp/times;//返回平均值
}

main.c

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "hdg12864.h"
#include "adc.h"
/*
将num(0-3.3V)显示到显示屏的第一行第一列
*/
void display(u16 num)
{
    u16 num4,num3,num2;
    num4=num/100;//取到十位数
    Draw_word(8+num4,0,2,0,16);//显示十位数
    
    //输出小数点
    Draw_word(8+10,0,2,16,16);
    
    num3 = (num/10)%10;
    Draw_word(8+num3,0,2,32,16);
    
    num2 = num%10;
    Draw_word(8+num2,0,2,48,16);
    
    //输出单位V
    Draw_word(8+11,0,2,64,8);
}

int main()
{
    u16 adc_val;
    HDG12864_Init();
    Adc_Init();
    while(1)
    {    
        adc_val  = Get_Adc_Average(ADC_Channel_1,10);
        display(adc_val/12.41819);
        delay(500);
    }
}
 

上一篇:stm32之ADC(规则通道)


下一篇:stm32 ADC采样的使用(最基本的方法 )