OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7242|回复: 14

关于adc双通道采样的问题

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
发表于 2017-6-8 09:48:16 | 显示全部楼层 |阅读模式
1金钱
rt,板子是f103rct6核心板,做的电压采样和电流采样,不用dma只在主程序里轮流采adc1的通道1和通道2的值并计算。但是当采样电压为0时adc输出的值不为0是什么问题?这是adc的配置 屏幕截图(3).png
主程序显示

最佳答案

查看完整内容[请看2#楼]

多通道扫描模式(即ScanConvMode被使能)下,不使用DMA是没法用的,因为EOC转换完成标志位只有在整个规则通道组全转换完后才置位。如果通道数量大于1,那读数据寄存器的时候总会读出最后一个通道的值。 你的程序是这样的 ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_InitStructure.ADC_ScanConvMode = ENABLE; 设置了2个通道,还开了扫描模式,也不配置规则通道组,还不用DMA,读的时候又每次只配置一半,肯定不应该好使 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2017-6-8 09:48:17 | 显示全部楼层
多通道扫描模式(即ScanConvMode被使能)下,不使用DMA是没法用的,因为EOC转换完成标志位只有在整个规则通道组全转换完后才置位。如果通道数量大于1,那读数据寄存器的时候总会读出最后一个通道的值。

你的程序是这样的
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
设置了2个通道,还开了扫描模式,也不配置规则通道组,还不用DMA,读的时候又每次只配置一半,肯定不应该好使。

建议用2个方法,一种是用DMA,另一种是按原子的例程那样,每次就用一个通道,读的时候重新配置通道号
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-8 09:50:16 | 显示全部楼层
这是主程序的显示代码 屏幕截图(4).png
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2017-6-8 10:42:22 | 显示全部楼层
扫描规则初始化了吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-6-8 21:03:01 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-8 21:44:28 | 显示全部楼层
止天 发表于 2017-6-8 10:42
扫描规则初始化了吗?

初始化了,第一张图的第46行。在主程序里轮流获取adc1的通道1和通道2的值
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-8 21:45:31 | 显示全部楼层
yklstudent 发表于 2017-6-8 21:19
电压为0时,ADC值为多少?

500多,调节被采样的电压,adc的值有变化但是不准确
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-10-12
在线时间
21 小时
发表于 2017-6-9 15:15:54 | 显示全部楼层
请检测一下两个采集引脚是否连接其他东西了,一般是这种情况
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-10-12
在线时间
21 小时
发表于 2017-6-9 15:16:23 | 显示全部楼层
请检测一下两个采集引脚是否连接其他东西了,一般是这种情况
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-9 15:40:59 | 显示全部楼层
命运枷锁 发表于 2017-6-9 15:15
请检测一下两个采集引脚是否连接其他东西了,一般是这种情况

已测试,输入电压为0的时候io与gnd之间的电压确实为0,原理图上也已经确认没有链接其他的东西
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-9 15:47:12 | 显示全部楼层
yklstudent 发表于 2017-6-9 14:54
夸张了,检测程序初始化是否正确,以及引脚是否正确了哦

这是我的初始化adc的代码,想写的是不用dma的双通道采样,不知道这样子写对不对adc采样初始化:
void Adc_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
        
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);
        
        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        ADC_DeInit(ADC1);
        
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_NbrOfChannel = 2;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_Init(ADC1, &ADC_InitStructure);
        
        ADC_Cmd(ADC1, ENABLE);
        
        ADC_ResetCalibration(ADC1);
        
        while(ADC_GetResetCalibrationStatus(ADC1));
                ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1));
}


u16 Get_Adc(u8 ch)
{
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
        
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
                return ADC_GetConversionValue(ADC1);
}


u16 Get_Adc_Average(u8 ch, u8 times)
{
        u32 temp_val = 0;
        u8 i = 0;
        for(; i < times; i++)
        {
                temp_val += Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}


主函数调用:
        while(1)
         {
                 TIM_SetCompare1(TIM1,9999);

                 adcx1 = Get_Adc_Average(ADC_Channel_1,20);
                 adcx2 = Get_Adc_Average(ADC_Channel_3,20);
                 
                 strcpy(n0,"n0.val=");//以下是输出采样值到hmi串口屏,可不管
                 sprintf(s0,"%d",adcx1);
                 strcat(n0,s0);
                 strcpy(n1,"n1.val=");
                 sprintf(s11,"%d",adcx2);
                 strcat(n1,s11);
                 HMISends(n0);
                 HMISendb(0xff);
                 HMISends(n1);
                 HMISendb(0xff);
                 temp1 = 0.225*pow(adcx1*(3.3/4096),3)-0.6519*pow(adcx1*(3.3/4096),2)+22.088*adcx1*(3.3/4096)+0.589;
                 sprintf(s1,"t9.txt=\"%f\"",temp1);
                 HMISends(s1);
                 HMISendb(0xff);
                 temp2 = 0.225*pow(adcx2*(3.3/4096),3)-0.6519*pow(adcx2*(3.3/4096),2)+22.088*adcx2*(3.3/4096)+0.589;
                 sprintf(s2,"t11.txt=\"%f\"",temp2);
                 HMISends(s2);
                 HMISendb(0xff);

          }

回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-10-12
在线时间
21 小时
发表于 2017-6-9 20:06:38 | 显示全部楼层
xianshasaman 发表于 2017-6-9 16:51
多通道扫描模式(即ScanConvMode被使能)下,不使用DMA是没法用的,因为EOC转换完成标志位只有在整个规则通 ...

支持楼上的观点
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-6-8
在线时间
6 小时
 楼主| 发表于 2017-6-11 20:26:40 | 显示全部楼层
xianshasaman 发表于 2017-6-8 09:48
多通道扫描模式(即ScanConvMode被使能)下,不使用DMA是没法用的,因为EOC转换完成标志位只有在整个规则通 ...

搞明白了,3q
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-7-8
在线时间
4 小时
发表于 2019-8-8 21:56:43 | 显示全部楼层
楼主可以把这个即测电压又测电流的程序代码发一下吗
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2021-4-17
在线时间
45 小时
发表于 2021-9-14 20:45:25 | 显示全部楼层
Wenshuai 发表于 2019-8-8 21:56
楼主可以把这个即测电压又测电流的程序代码发一下吗

楼主可以把这个即测电压又测电流的程序代码发一下吗+1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 06:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表