STM32.ADC

ADC实验

原理图:

1.ADC配置函数

/* enable adc1 and config adc1 to dma mode */
ADC1_Init();

/**
  * @brief  ADC1初始化
  * @param  无
  * @retval 无
  */
void ADC1_Init(void)
{
	ADC1_GPIO_Config();    //端口初始化
	ADC1_Mode_Config();
}

 对于配置ADC1的工作模式为MDA模式

ADC1是挂载到DMA1的通道1的

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)//模拟量转换成数字量后存放到该地址中

看如下存储器映像 寄存器组起始地址(起始地址)

便宜地址:0x4c

----------------------------------------------------------------------------------------------------------------------

那么对于ADC自身配置:

采样总时间:

对于STM32最快的ADC转换时间也就是1US了,打死都不会变的了

-----------------------------------------------------------------------------------------------------------------------

代码:

/**
  * @brief  配置ADC1的工作模式为MDA模式
  * @param  无
  * @retval 无
  */
static void ADC1_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;

    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);//重新配置

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;    //内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向从#define DMA_DIR_PeripheralSRC
                                    //((uint32_t)0x00000000)开始发
    DMA_InitStructure.DMA_BufferSize = 1;            //每次只发送一个数据
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;          //内存地址固定
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;              //优先级(有三个)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    /* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);

    /* ADC1 configuration */
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //独立ADC模式(因为咱们只用一个)
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ;          //禁止扫描模式,扫描模式用于多通道采集
                              //(ADC有3个通道,若几个通道同时采集一个模拟量则用扫描)
                          //若同时采(交叉采集),速率更高,对于32的示波器就是三路同时采集   
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //开启连续转换模式,即不停地进行ADC转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //不使用外部触发转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
                        //采集数据右对齐,数据时12位,保存数据的寄存器是16位
    ADC_InitStructure.ADC_NbrOfChannel = 1;             //要转换的通道数目1
    ADC_Init(ADC1, &ADC_InitStructure);

    /*配置ADC时钟,为PCLK2的8分频,即9MHz(最大是14M)68/9MS*/
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
    /*配置ADC1的通道11为55.5个采样周期(模拟量转换成数字量需要多长时间),
     序列为1(有三个通道它排第一) */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);

    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);

    /*复位校准寄存器 */
    ADC_ResetCalibration(ADC1);
    /*等待校准寄存器复位完成 */
    while(ADC_GetResetCalibrationStatus(ADC1));

    /* ADC校准 */
    ADC_StartCalibration(ADC1);
    /* 等待校准完成*/
    while(ADC_GetCalibrationStatus(ADC1));

    /* 由于没有采用外部触发,所以使用软件触发ADC转换 */
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

对于main函数

    while (1)
    {
        ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值

        printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
        printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); 

        Delay(0xffffee);
    }

为什么是4096

设V为我们转换出来的电压 

V/3.3  = 读取的寄存器值/4096  (寄存器满值2^12 = 4096) 当然此时Vref- = 0V  ;Vref+ = 3.3V;若 Vref+ = (x)V  V/(x)  = 读取的寄存器值/4096

--------------------------------------------------------------------------------------------------------------------------

 

时间: 2024-11-02 06:16:09

STM32.ADC的相关文章

STM32——ADC

STM32--ADC 宗旨:技术的学习是有限的,分享的精神的无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执行 :ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中 :模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高 / 低阈值. 对于 ADC 来说,我们最关注的就是它的分辨率.转换时间.ADC 类型.参考电压范围: (1)分辨率:12 位分辨率.不能直接测量负电压,所以没有符号位,

STM32 ADC 测电压

1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的通道1. 查看文档<STM32F103X.pdf>第13页,时钟树图: 得知ADC1可2,4,6,8分频,又ADC输入时钟不得超过14MHZ(参见STM32参考手册RM0008第11章ADC). //初始化ADC //这里我们仅以规则通道为例 //我们默认将开启通道0~3 void Adc_Ini

stm32 adc计算

用STM32自带的ADC读取引脚电压值,读回来的数据怎么转换成单位为V的数值??? V(ADC) = Value(ADC) * V(ref)/4096 (stm32的ADC是12位的,所以ad字的最大值是4096) 其中V(ADC)为算出的电压值:Value(ADC)为采集的AD值:V(ref)为参考电压,一般为3.3V. 比如你STM32的参考电压为3.3v,采集的AD值为1024,那么转换为电压V(ADC) = 1024×3.3/4096 = 0.825V

STM32 ADC基础与多通道采样

12位ADC是一种逐次逼近型模拟数字数字转换器.它有多达18个通道,可测量16个外部和2个内部信号源.ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生.如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置. ADC通常要与DMA一起使用 这里只是简单的用库配置ADC 不断扫描来实现ADC的应用. 配置DMA: void DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体 DM

对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解

举例 用ADC1 规则通道的顺序为CH0,CH1,CH2,CH3, 不启动SCAN模式: 在单次转换模式下: 启动ADC1,则 1.开始转换CH1(ADC_SQR的第一通道) 转换完成后停止,等待ADC的下一次启动,继续从第一步开始转换 在连续转换模式下: 启动ADC1,则 1.开始转换CH0(ADC_SQR的第一通道) 转换完成后回到第一步,继续转换 启动SCAN模式下 在单次转换模式下: 启动ADC1,则 1.开始转换CH0. 2.转换完成后自动开始转换CH1 3.转换完成后自动开始转换CH

STM32 ADC DMA 中断模式多通道读取ADC转换值

因为做一个电机控制项目,其中需要用到用PWM触发ADC,读取ADC的转换值. 这里有两个关键问题: 第一,如何使PWM触发ADC转换? 第二,如何在ADC多通道扫描模式下,读取各个channel的adc转换值? 第三,如何使用DMA读取多通道ADC转换值? 第一个问题,首先需要将ADC设置成外部触发转换,第二需要选择触发是发生在Timer的上升沿还是下降沿.程序如下: adc.ADC_Resolution = ADC_Resolution_12b; adc.ADC_ScanConvMode =E

STM32 ADC规则组和注入组配置方法

//############################################################//近期在用STM32F103编写无刷电机矢量控制,在配置ADC模式时遇到很多奇怪的问题,网上能说清楚的资料太少,//公布我配置的结果,实测OK//3组规则通道连续转换+DMA//2组注入通道TIM1的4通道触发(规格书未说明是上升沿还是下降沿触发,实测波形为上升沿触发)//##################################################

stm32之TIM+ADC+DMA采集50HZ交流信号

http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b563710f4bb56644b5bc7823c390ef50f1aa8e737012a1e65f2dedf883d80f9c57478de6323706bd71c4dce5ff58b11769737902cefaa18ecb9e732e5adc5d3a95744ca245f3cdfae&p=8b2a975

STM32学习笔记1(ADC多通道采样)

STM32 ADC多通道转换描述:用ADC连续采集11路模拟信号,并由DMA传输到内存.ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ.在每次转换结束后,由DMA循环将转换的数据传输到内存中.ADC可以连续采集N次求平均值.最后通过串口传输出最后转换的结果.程序如下:#i nclude "stm32f10x.h" //这个头文件包括STM32F10x所有外围寄存器.位.内存映射的定义#i nclude "eval.h" //头文件(包括串口.按键.L