• STM32F030F4 之ADC 单通道单次采集


       以STM32F030F4P6,uVision开发环境为例,注意了,若使用其它相近芯片,本文仅供参考。

       需要在PA1口给入可调的模拟电压,程序在uVision仿真环境下运行,仿真编程器为ST-LINK2,程序在主环

       while (1)处设断点,查看dyzh的值即为PA1口输入的电压值。

    // STM32F030F4P6的ADC只有ADC1通道,有9路,分别是:
    // 6 脚PA0 ADC_IN0
    // 7 脚PA1 ADC_IN1
    // 8 脚PA2 ADC_IN2
    // 9 脚PA3 ADC_IN3
    // 10脚PA4 ADC_IN4
    // 11脚PA5 ADC_IN5
    // 12脚PA6 ADC_IN6
    // 13脚PA7 ADC_IN7
    // 14脚PB1 ADC_IN9

    下面是main.c文件

    #include "stm32f0xx.h"

    #include "stm32f0xx_rcc.h"
    #include "stm32f0xx_gpio.h"
    #include "stm32f0xx_adc.h"

    float adc_data=0,dyzh=0; //采集值变量,电压显示值变量

    //******************************************************************************************************************* 

    //引用请指明出处  https://www.cnblogs.com/beiyhs/p/11412273.html

    //***********************************************************************************************  北有寒山  ****** 

    void ADC_GPIO_Init(void)                                           //ADC-GPIO输入引脚配置,在此可以设置9路外部输入通道
    {
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA时钟

    GPIO_InitTypeDef GPIO_InitStructure;                                            //声明结构变量
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1 ;          //定义PA0,PA1脚为AD输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;                     //IO口为模拟输入模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //AD口设置为浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                       //按以上参数设置A口 A0/A1
    }

    //*****************************************************************************************************
    void ADC1_Init(void)                                                                                 //配置ADC参数及采集
    {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);    //使能AHB预分频器到外设ADC1的开关
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4) ;                    //时钟分频48M/4=12M 最大时钟不超过14M

    ADC_DeInit(ADC1);                                                                                 //ADC复位
    ADC_DMACmd(ADC1, DISABLE);                                                          //禁止DMA

    ADC_InitTypeDef ADC_InitStuctrue;                                                        //声明ADC结构变量
    ADC_StructInit(&ADC_InitStuctrue);                            //根据ADC_InitStuctrue中指定参数初始化ADC1的寄存器
    ADC_InitStuctrue.ADC_Resolution=ADC_Resolution_12b;                     //采集设为12位精度即4095
    ADC_InitStuctrue.ADC_ContinuousConvMode=DISABLE;                      //禁止持续ADC,设为单次ADC采集
    ADC_InitStuctrue.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None; 

                                                                                                                      //不用外部触发,软件触发转换
    ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right;                      //数据右对齐
    ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward; //数据覆盖/浏览方向
    ADC_Init(ADC1,&ADC_InitStuctrue);                                                        //按以上参数设置ADC1

    ADC_ChannelConfig(ADC1,ADC_Channel_1,ADC_SampleTime_239_5Cycles); //配置ADC1通道1即PA1,

                                                                                                                                    //采样周期239.5个周期

    ADC_GetCalibrationFactor(ADC1);                                                           //校准ADC1
    ADC_Cmd(ADC1,ENABLE);                                                                     //使能ADC1
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN)==RESET);          //等待ADC准备
    ADC_StartOfConversion(ADC1);                                                              //软件启动ADC转换
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);            //等待ADC完成

    adc_data=ADC_GetConversionValue(ADC1);                                         //所得数据即为ADC数据

    //**********************************************************************************************

    int main(void)
    {
    ADC_GPIO_Init();                                             //配置ADC的IO口
    ADC1_Init();                                                      //配置ADC参数及采集
    dyzh=(adc_data*3.288)/4095;                          //转换采集值为电压值

                                                                             //参考电压3.288V,12位分辨率4095

    while (1)                                                           //此处可以设断点,查看上面dyzh值
    { }
    }

    //**********************************************************************************************

  • 相关阅读:
    Java多态(更新中...)
    C语言free释放内存后为什么指针里的值不变?竟然还可以输出?
    LeetCode:344-反转字符串
    20150518 字符设备驱动
    20150517 Linux文件系统与设备文件系统
    20150514我读《深入理解linux内核》之虚拟文件系统笔记
    双系统Ubuntu下修复启动项的两种方法
    20150503 imx257下实现I2C驱动的四种方法
    20150502 调试分析之 使用gdb远程调试ARM开发板
    20150501 调试分析之 修改内核来定位系统僵死问题
  • 原文地址:https://www.cnblogs.com/beiyhs/p/11412273.html
Copyright © 2020-2023  润新知