STM32F1进行ADC采样功能学习

1.adc.c文件

#include "adc.h"



void ADC1_Init_Config(void)
{
    
    ADC_InitTypeDef  ADC_InitStruct;

    //1.配置ADC的GPIO引脚
    GPIO_InitTypeDef  GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//输入功能不用设置输出速度参数
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    
    //2.配置时钟,GPIOA时钟和ADC1外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE);

    //PA2 ADC_IN2 
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    //3.配置ADC模式相关参数
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; //设置成连续转换模式(ENABLE)或者单次转换模式(DISABLE)
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,12位的数据,右对齐不用处理高位,高位就是0
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //若是选择外部触发转换,选择对应的触发条件,否则设置为不使用外部触发
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//多种模式组合,选择一种
    ADC_InitStruct.ADC_NbrOfChannel = 1;//需要转换的通道数,这里只有1个通道要转换
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;//多通道扫描转换(ENABLE),或者是单通道转换(DISABLE),这里选择单通道转换

    //4.配置ADC时钟不能超过14MHz    系统时钟72MHz进行6分频,12MHz
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    //5.ADC1初始化
    ADC_Init(ADC1, &ADC_InitStruct);

    //6.ADC1功能使能
    ADC_Cmd(ADC1, ENABLE);
}

2.main函数

#include "stm32f10x.h"
#include "adc.h"
#include "usart1.h"

uint16_t adc_val = 0;
void delay(void)
{
    uint32_t t = 0;
    for(t = 0; t < 0xfffef; t ++);
}

int main(void)
{
    USART1_Init();
    ADC1_Init_Config();
    
    //ADC规则通道配置
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);
    //RANK:数值越小,越先转换;这里通道2,第一个进行AD转换;要是有多个通道的话,设定先后顺序
    //    ADC采样周期计算公式 = ADC_SampleTime_xxxCycles5 + 12.5个周期,这里是256个周期,频率设置成了12MHz,所以采样时间 = 256/12MHz = 21.3us,采样时间长,采样会准确些

    //ADC采样前先进行校准动作
    ADC_ResetCalibration(ADC1);//复位校准
    while(ADC_GetResetCalibrationStatus(ADC1) != RESET); //平时是1,复位完成变成0

    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1) != RESET);//平时是1,校准完成变成0

    


    while(1)
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //平时是0,转换完成变成1

        adc_val = ADC_GetConversionValue(ADC1);
        printf("AD-VALUE: %.3f\r\n", (float)adc_val/4096.0*3.3);//这里注意需要除以4096.0,如果写成了整数,打印输出就会变成0.0了

        delay();
    }
}

 

posted @ 2025-03-27 21:21  了解2号  阅读(113)  评论(0)    收藏  举报