ADC连续采集模式

2019-07-20 05:37发布

本帖最后由 济颠进京 于 2018-10-18 09:55 编辑

本人在用正点原子探索者开发板采集一个电压波形,连续采集模式,但是通过串口助手返回来的数据只有两次的转换数据,哪位大神能帮忙出个主意,谢谢。附上源码
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"  
#include "usart.h"   
#include "adc.h"

   
int main(void)
{      
         u16 adcx;
        float voltage_show;
         
        Stm32_Clock_Init(336,8,2,7);    //设置时钟,168Mhz
        delay_init(168);                  //延时初始化  
        uart_init(84,115200);          //初始化串口波特率为115200   
        Adc2_Init();                   //初始化ADC2
         
         
        while(1)
        {
               
                    adcx=Get_Adc2();
                    voltage_show=(float)adcx*(3.3/4096);
                    printf("the voltage is %f ",voltage_show);                    
                    
        }
}
[/mw_shl_code]
下面是ADC部分
[mw_shl_code=c,true]#include "adc.h"         

//初始化ADC
//ADC1 以连续采样模式工作  单一CH5                                                                                                                                    
void  Adc2_Init(void)
{   
        //先初始化IO口
         RCC->APB2ENR|=1<<9;            //使能ADC2时钟
        RCC->AHB1ENR|=1<<0;            //使能PORTA时钟         
        GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_NONE);        //   PA5模拟输入,不带上下拉电阻   
         
        RCC->APB2RSTR|=1<<8;           //ADCs复位
        RCC->APB2RSTR&=~(1<<8);        //复位结束         
        ADC->CCR|=1<<16;                //ADCPRE: ADC时钟 ADCCLK=PCLK2/4=84/4=21Mhz
                                        //ADC挂载到APB2总线上,ADC时钟最好不要超过36Mhz
        
          ADC2->CR1=0;                   //CR1设置清零
        ADC2->CR2=0;                   //CR2设置清零
        
          ADC2->CR1&=~(3<<24);          //RES:12位分辨率模式,(15个时钟周期总转换时间)         
         ADC2->CR2&=~(1<<11);           //ALIGN:右对齐        
                                       
          ADC2->CR2|=1<<10;             //EOCS:设置规则通道 每单次转换完成EoC标志 置位;
          ADC2->CR2|=1<<1;                   //CONT: 连续转换                           
                                       
         
        ADC2->SQR1&=~(15<<20);        //L:设置规则通道序列总数为1
        ADC2->SQR3|=5<<0;             //SQ1:设置规则序列第一次转换为通道5                           
                 
         
         
          //设置通道5 的采样时间
        ADC2->SMPR2=0;                //所有通道采样时间清空         
         ADC2->SMPR2&=~(7<<(3*5));         //SMP5:通道5采样时间:3个周期                  
         
          ADC2->CR2|=1<<0;                   //ADON: 开启AD转换器
          ADC2->CR2|=1<<30;                   //SWSTART: 开启规则通道转换
         
}                                 
//获得ADC值
//返回值:转换结果
u16 Get_Adc2(void)   
{        
         
        while(!(ADC2->SR&(1<<1)));      //等待转换结束
          return ADC2->DR;                  //返回adc值同时硬件自动清除EoC标志位
         
                  
}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。