OpenEdv-开源电子网

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

板子里面ADC程序疑惑??

[复制链接]

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
发表于 2012-8-17 17:23:30 | 显示全部楼层 |阅读模式
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)  
{
 //设置转换序列     
 ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
 ADC1->SQR3|=ch;          
 ADC1->CR2|=1<<22;       //启动规则转换通道
 while(!(ADC1->SR&1<<1));//等待转换结束     
 return ADC1->DR;  //返回adc值 
}
第一:ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch ,为什么是E0,后面是F0不就可以了吗??
第二://ch:通道值 0~3,说是0---3,不是0--15都可以吗??手册上说的是第一次转换的通道??
麻烦原子兄帮我看看..


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
发表于 2012-8-17 17:49:22 | 显示全部楼层
这种类似问题再仔细看看手册就能明白
回复 支持 反对

使用道具 举报

15

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2012-8-10
在线时间
2 小时
发表于 2012-8-17 18:46:19 | 显示全部楼层
我来回答吧 
  第一:ADC1->SQR3寄存器中是5位未一个单位,ADC1->SQR3&=0XFFFFFFE0,是清除低5位里面的数,要是F0,保留第五位???呵呵
 第二:可以是0到15,看你自己喜欢喽。。
学海无涯,回头是岸
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-17 19:07:04 | 显示全部楼层
1,
找stm32参考手册看了寄存器描述再问.
或者看了不完全手册相关章节再问.
2,
0~15是都可以,但是我们配置的IO只是0~3.所以你给4~15,是无效的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-17 20:48:03 | 显示全部楼层
谢谢各位...
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-18 09:55:53 | 显示全部楼层
原子兄,我想用扫描模式,连续转换,假设有10个通道,我要怎样去读些通道的值呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-18 10:29:50 | 显示全部楼层
先把10个通道都配置好.然后等待每个通道转换结束读数据.也可以用DMA.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 10:02:14 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子兄,如何判断现在结束的那个通道的呢?如果不开中断的话,比如用查询,例如下面的代码,因为是连续的,扫描完最后一个通道又会继续扫描第一个通道,我现在的疑问是,连续转换,如果你没有读上一个通道的值(DR),是不是,就一直转换当前通道,等待你读完的时候再去转换下一个通道???
while(!(ADC1->SR&1<<1));//第一次
adc_table[0]= ADC1->DR;
BIT(ADC1->SR,1) = 0;
while(!(ADC1->SR&1<<1));//第二次
adc_table[1]= ADC1->DR;
 BIT(ADC1->SR,1) = 0;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-20 12:41:20 | 显示全部楼层
当前是哪个通道,这个我也没研究了,呵呵.看看数据手册有没有解决办法.
如果你用DMA,就不需要再去关心当前通道了,直接等所有的转换完成,去依次读取数据就完了.
如果不用DMA,那么每次转换后,都有转换完成标志,依次的就对应各个通道.也是没问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 13:42:24 | 显示全部楼层
上代码,大家帮我看看是不是哪里配错了
void ADC_Scan_Init(void)
{
     //先初始化IO口
  RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
GPIOA->CRL&=0XFFFF0000;//PA0 1 2 3 anolog输入
//通道10/11设置  
RCC->APB2ENR|=1<<9;    //ADC1时钟使能   
RCC->APB2RSTR|=1<<9;   //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束     
RCC->CFGR&=~(3<<14);   //分频因子清零
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降! 
RCC->CFGR|=2<<14; //72M---6分频就是12M        

ADC1->CR1&=0XF0FFFF;   //工作模式清零//独立工作模式,2个ADC单独工作
ADC1->CR1|=0<<16;      //独立工作模式  
//ADC1->CR1&=~(1<<8);    //非扫描模式
ADC1->CR1|=1<<8;        //扫描模式
//ADC1->CR2&=~(1<<1);    //单次转换模式
    ADC1->CR2|=1<<1;     //连续转换----注意这里就已经设置了扫描模式和连续转换
    
    ADC1->CR2&=~(7<<17);    
ADC1->CR2|=7<<17;    //软件控制转换 
ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
//我们这里是软件事件
ADC1->CR2&=~(1<<11);   //右对齐  
ADC1->SQR1&=~(0XF<<20); //ADC规则寄存器1
ADC1->SQR1|=3<<20;     //1个转换在规则序列中 也就是只转换规则序列1
BIT(ADC1->SQR1,20) = 1;
BIT(ADC1->SQR1,21) = 1;  
//规则通道里面有4个要转换
ADC1->SQR3 =0X00018820;//规则通道里面有CH0-1-2-3通道
//设置通道0~3的采样时间   //12M下239.5周期大概接近20us
ADC1->SMPR2&=0XFFFFF000;//通道0,1,2,3采样时间清空   
ADC1->SMPR2|=7<<9;      //通道3  239.5周期,提高采样时间可以提高精确度  
ADC1->SMPR2|=7<<6;      //通道2  239.5周期,提高采样时间可以提高精确度  
ADC1->SMPR2|=7<<3;      //通道1  239.5周期,提高采样时间可以提高精确度  
ADC1->SMPR2|=7<<0;      //通道0  239.5周期,提高采样时间可以提高精确度  

ADC1->CR2|=1<<0;     //开启AD转换器  
ADC1->CR2|=1<<3;        //使能复位校准  
while(ADC1->CR2&1<<3);  //等待校准结束   
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。   
ADC1->CR2|=1<<2;        //开启AD校准    
while(ADC1->CR2&1<<2);  //等待校准结束
BIT(ADC1->CR1,5) = 1; //开启ADC中断
MY_NVIC_Init(2,2,ADC1_2_IRQChannel,4);//抢占2,子优先级3,组2
ADC1->CR2|=1<<22;       //启动规则转换通道 
}



u16 adc_table[4]={0,0,0,0};
void Get_Adc_Scan(void)//用中断的话,该函数不用
{
   
while(!(ADC1->SR&1<<1));//等待转换结束
adc_table[0]= ADC1->DR;
    //BIT(ADC1->SR,1) = 0;
    while(!(ADC1->SR&1<<1));
    adc_table[1]= ADC1->DR;
   // BIT(ADC1->SR,1) = 0;
    while(!(ADC1->SR&1<<1));
    adc_table[2]= ADC1->DR;
   // BIT(ADC1->SR,1) = 0;
    while(!(ADC1->SR&1<<1));
    adc_table[3]= ADC1->DR;
   //BIT(ADC1->SR,1) = 0;
 //   BIT(ADC1->CR2,22) = 0;
//return ADC1->DR; //返回adc值

}
u8 state_adc = 0;
void ADC_IRQHandler(void)
{
ADC1->CR2|=1<<22;
switch(state_adc)
{
 case 0: adc_table[0]= ADC1->DR;state_adc++;break;
 case 1: adc_table[1]= ADC1->DR;state_adc++;break;
 case 2: adc_table[2]= ADC1->DR;state_adc++;break;
 case 3: adc_table[3]= ADC1->DR;state_adc=0;break;
}       //启动规则转换通道
}
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 13:43:28 | 显示全部楼层
开始用查询,现在用中断做的,效果还是一样...采的都是一个通道的
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 13:54:07 | 显示全部楼层
(BIT(ADC1->SQR1,20) = 1;
BIT(ADC1->SQR1,21) = 1;)---等价于下面的---意思就是规则通道里面有4个步进转换的通道 
ADC1->SQR1|=3<<20;     //1个转换在规则序列中 也就是只转换规则序列1
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 13:55:24 | 显示全部楼层
现在是轮流转换0 1 2 3----ADC1->SQR3 =0X00018820;//规则通道里面有CH0-1-2-3通道,不知道是哪里的问题
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2011-7-26
在线时间
8 小时
 楼主| 发表于 2012-8-20 13:56:54 | 显示全部楼层
如果不行,那么是不是如果用连续扫描模式,就必须要用DMA...大神帮帮忙啊 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-20 14:14:38 | 显示全部楼层
看着没啥问题...
参考下别人的吧:http://www.openedv.com/posts/list/3329.htm
他这个是ADC+DMA,你把DMA部分去掉,应该就是和你的类似了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 10:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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