stm32 用中断方式实现ADC的多通道、单次转换

2019-03-23 17:40发布

最近在学习stm32f103rbt6。发现网上都是用DMA实现ADC的多通道、连续转换。 我想用中断实现ADC的多通道、单次转换。在中断函数里读取每次转换的结果,但是,用我下面的代码,只能实现读出一个通道的转换结果。百思不得其解,请大家帮我分析分析。谢谢!

void ADC_init(void)
{
           ADC_InitTypeDef ADC_InitStructure;
           ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        
           ADC_InitStructure.ADC_ScanConvMode = ENABLE;
           ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   // 单次转换
           ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
           ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
           ADC_InitStructure.ADC_NbrOfChannel = 2;
           ADC_Init(ADC1, &ADC_InitStructure);
           ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5);
           ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_239Cycles5);          

           ADC_TempSensorVrefintCmd(ENABLE);
           ADC_Cmd(ADC1, ENABLE);
           ADC_ResetCalibration(ADC1);
           while(ADC_GetResetCalibrationStatus(ADC1));
           ADC_StartCalibration(ADC1);//开始校准  
           while(ADC_GetCalibrationStatus(ADC1));//等待校准完成
           ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
}

u16 Get_ADC(void)
{
        unsigned int i;
        u16 temper=0,temp=0;
        temp=ADC_GetConversionValue(ADC1);
        temper +=temp;
        Delay(0xfff);
        return temper;
}

void ADC1_2_IRQHandler(void)
{
ADC_Temp=Get_ADC();  //ADC_Temp 和 Vsense 是全局变量
  printf("  %d",ADC_Temp);
        Vsense=(ADC_Temp*3.3)/4096;

        printf("the temperature now is : %.2f ",Vsense);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);

} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Li_Lei
1楼-- · 2019-03-23 22:48
/ 用注入模式
        ADC_InjectedChannelConfig(ADC1, ADC_INJECTED_GROUP1_CHANNEL1, 1, ADC_CHANNEL_SAMPLETIME);
        ADC_InjectedChannelConfig(ADC1, ADC_INJECTED_GROUP1_CHANNEL2, 2, ADC_CHANNEL_SAMPLETIME);

一次四个,结果在寄存器JDR1~4中
jonny0811
2楼-- · 2019-03-24 02:42
 精彩回答 2  元偷偷看……
Li_Lei
3楼-- · 2019-03-24 08:34
本帖最后由 huo_hu 于 2017-2-2 22:41 编辑
jonny0811 发表于 2017-2-1 20:11
版主您好。关于STM32的AD,如果说我们用的是N个通道的规则采样,并且使能了扫描模式,那么就只能使用DMA ...

也不是,dma的触发条件和通道的转换是两个问题,自动切换通道的方式有两种,规则和注入。
dma的触发只能是一种就是ad转换完成,特别的你可以用扫描模式注入和规则模式里整个序列转换完才算是完成,dma的源地址是可以设置的。注入方式的数据保存地址是连续的。

不知道说清楚没有
jonny0811
4楼-- · 2019-03-24 14:30
huo_hu 发表于 2017-2-2 22:37
也不是,dma的触发条件和通道的转换是两个问题,自动切换通道的方式有两种,规则和注入。
dma的触发只能 ...

谢谢版主,我结合文档再看看,因为以前也没怎么深入接触AD
Li_Lei
5楼-- · 2019-03-24 18:33
 精彩回答 2  元偷偷看……
xiaozhuang523
6楼-- · 2019-03-24 23:22
你用扫描模式单次转换,转换的结果只能是最后一个通道的 ,规则组只有一个寄存器ADC_DR,你每次转换的值都会被下一次的值覆盖掉,要用DMA把转换的数据传到RAM,每转换完一个通道DMA会把数据传走不影响下一次转换值,转换完最后一个通道的时候产生EOC,就可以读取多通道的数据了

一周热门 更多>