[求助] stm32f103 adc1和adc2检测无变化

jiaoguan   2017-11-4 10:17 楼主
adc1、adc2接的是温度传感器,我把温度传感器放入热水所测到的数据和常温下测到的数据基本一样。刚接触stm32,程序是拿网上的程序改的,不知道有没有错误,希望大神能指导一下。
void ADC12_Init(void)
{
        ADC_InitTypeDef                ADC_InitStructure;
        DMA_InitTypeDef                DMA_InitStructure;
        GPIO_InitTypeDef        GPIO_InitStructure;

        //开启时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                                     //使能DMA传输
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2,ENABLE);                //使能ADC传输        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                                                 //使能GPIO传输

        //GPIOC作为模拟通道输入引脚
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
        GPIO_Init(GPIOA,&GPIO_InitStructure);      //初始化GPIOA         

        ADC_DeInit(ADC1);                 //复位ADC1
        RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟,72/6=12MHz

  //-----------ADC1参数设置----------------------------------
        ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult;              //ADC同步规则模式
        ADC_InitStructure.ADC_ScanConvMode=DISABLE;                  //单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;            //单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel=1;               //顺序进行规则转换的ADC通道数目1
        ADC_Init(ADC1,&ADC_InitStructure);                  //初始化ADC1

        ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_71Cycles5);  //ADC_Test1采样        
        //ADC_RegularChannelConfig(ADC1,ADC_Channel_6, 2,ADC_SampleTime_71Cycles5);  //ADC_Test2采样        
        //ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 3,ADC_SampleTime_71Cycles5);  //ADC_Test3采样        
        //ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 4,ADC_SampleTime_71Cycles5);  //ADC_Test4采样        

  //-----------ADC2参数设置----------------------------------
        ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult;              //ADC同步规则模式
        ADC_InitStructure.ADC_ScanConvMode=DISABLE;                  //单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;            //单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel=1;               //顺序进行规则转换的ADC通道数目1
        ADC_Init(ADC2,&ADC_InitStructure);                  //初始化ADC1

        ADC_RegularChannelConfig(ADC2,ADC_Channel_1 ,1,ADC_SampleTime_71Cycles5);  //FreeBack1采样        
        //ADC_RegularChannelConfig(ADC2,ADC_Channel_7 , 2,ADC_SampleTime_71Cycles5);  //FreeBack2采样        
        //ADC_RegularChannelConfig(ADC2,ADC_Channel_5,  3,ADC_SampleTime_71Cycles5);  //FreeBack3采样        
        //ADC_RegularChannelConfig(ADC2,ADC_Channel_3,  4,ADC_SampleTime_71Cycles5);  //FreeBack4采样        

        ADC_ExternalTrigConvCmd(ADC2, ENABLE);                                     //使能ADC2外部触发转换

  //------------DMA参数设置----------------------------------
        DMA_DeInit(DMA1_Channel1);                                 //将DMA的通道x寄存器重设为缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR); //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Adc_buffer;   //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;         //数据传输方向,从内存读取
        DMA_InitStructure.DMA_BufferSize = 1;                      //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;             //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                      //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;      //数据宽度为32位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;              //数据宽度为32位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;          //工作在循环缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;     //DMA通道 x拥有中等优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;            //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);            //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器

        DMA_Cmd(DMA1_Channel1,ENABLE);                          //打开DMA传输

        ADC_Cmd(ADC1,ENABLE);                 //使能ADC1
        ADC_Cmd(ADC2,ENABLE);                 //使能ADC2

        ADC_ResetCalibration(ADC1);                 //开启复位校准
        while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
        ADC_StartCalibration(ADC1);                 //开启AD校准
        while(ADC_GetCalibrationStatus(ADC1));      //等待校准结束

        ADC_ResetCalibration(ADC2);                 //开启复位校准
        while(ADC_GetResetCalibrationStatus(ADC2)); //等待复位校准结束
        ADC_StartCalibration(ADC2);                 //开启AD校准
        while(ADC_GetCalibrationStatus(ADC2));      //等待校准结束


        ADC_DMACmd(ADC1, ENABLE);                      //ADC1 DMA传送数据打开
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);         //使能指定的ADC1的软件转换功能
}




  • UC截图20171104101649.png

回复评论 (3)

你的温度输出设置在哪处理的呢?还有,你用两个ADC通道接两个温度传感器吗?应该是你温度输出那一块的问题,这好像没什么问题,你看看在哪处理的温度,看看有没有问题
点赞  2017-11-4 11:43
两个adc都是接温度传感器,我是在keil仿真的时候直接读Adc_buffer的值
点赞  2017-11-4 13:28
推荐的这颗国产单片机型号为HK8S003,是深圳航顺自主研发的8位单片机,主要特点是:价格超低:1.4RMB,采用高速低功耗CMOS工艺设计开发的增强型8位单片机,内部最多16K FLASH程序存储器,双256BYTES IRAM和XRAM ,有18个I/O口,5个16位定时器/计数器,3组12位带死区控制互补PWM,2个UART,1个SPI,16个外部中断,8+2路12位ADC,16个中断源,四种系统工作模式:正常、低频、掉电和空闲。采用宽电压设计~

点赞  2017-11-4 14:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复