OpenEdv-开源电子网

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

求助:请教ADC任意通道的设置

[复制链接]

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-6-26
在线时间
6 小时
发表于 2012-6-26 17:03:33 | 显示全部楼层 |阅读模式

例程提供的是PA0(ADC0),但是我不想用PA0口,因为这个口要用作唤醒功能,在这里我想用PC4 (ADC14),这个脚应该是悬空的,单次转换,仅开启SQ14,也就是只转换SQ14通道。设置规则转换数量0000(1个),SQ14编号为00000,其他通道大于00000,这样应该就可以了吧 ,可是得到的值不正确,接GND时 2.1V。
还有多通道的单次转换,比如开启SQ1 SQ2 SQ3 ,编号分别为0,1,2,通道数量为3个, 如果是扫描方式肯定会按SQ1,SQ2,SQ3自动顺序转换,如果是单次转换是什么情况?第一次转换肯定是SQ1,第二次转换是SQ1还是SQ2? 以下是SQ14的转换代码,不知道是哪里错了,难道设置1个通道只能从SQ1开始吗?求助原子哥帮忙!
 #include "adc.h"
#include "lcd.h"
u16 ADC_Value;
void My_ADC_Init(void)
{
 RCC->APB2ENR|=1<<4;     //PC4
 GPIOC->CRL&=0xFFF0FFFF;  //port in  PC4
 RCC->APB2ENR|=1<<9;      //ADC1 enable
 RCC->APB2RSTR|=1<<9;  //reset ADC
 RCC->APB2RSTR&=~(1<<9);  //close reset
 RCC->CFGR&=~(3<<14);  //clear clock set
 RCC->CFGR|=2<<14;      //set 12MHz   不超过14M

 ADC1->CR1&=0X00000000;     //clear
 ADC1->CR2&=0X00000000;     //clear  
 ADC1->CR2|=0<<11;   // left algin
 ADC1->CR2&=~(1<<1);
 ADC1->CR2|=7<<17;     //SWSTART 软件控制
 ADC1->CR2|1<<20;   //外部触发
 ADC1->SQR1&=0x00000000;  //1个通道
 ADC1->SQR1|=0x0007E0FF;  //  00000000   0000 0111|1 01110 00|000 01101 0x00 07 b8 0D 
 ADC1->SQR2&=0x00000000;  // 00 01100 0|1011 0101|0 01001 01|000 00111 0X18 B5 25 07
 ADC1->SQR2|=0xFFFFFFFF; 
 ADC1->SQR3&=0x00000000;  //  00 00110 0|0101 0010|0 00011 00|010 00001 0x0C 52 0C 41
 ADC1->SQR3|=0xFFFFFFFF;
 ADC1->SMPR1&=0XFFFF1FFF;
 ADC1->SMPR1|=7<<12;    //通道14 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);     //软件置位,硬件清除
}
u16 GetADC(void)

 ADC1->SQR1&=0xFFFFF70F;
// ADC1->SQR1|=0x22222702;  //1个通道 不能确定是哪个通道!  14[9-5]
 ADC1->SQR1|=0x0007FF0F; 
 ADC1->CR2|=1<<0; //启动AD
 ADC1->CR2|=1<<22;     //启动规则转换
 while(!(ADC1->SR&1<<1));   //cheak EOC  while(!(ADC1->SR&1<<1));//
 ADC1->SR&=~(1<<1);     //clear EOC
 return ADC1->DR;
}
void Print_ADC(void)

 float ADC_temp;
 ADC_Value=GetADC();

 LCD_ShowNum(156,180,ADC_Value,4,16);//显示ADC的值
 ADC_temp=(float)ADC_Value*(3.3/4096);
 ADC_Value=ADC_temp;
 LCD_ShowNum(156,200,ADC_Value,1,16);//显示电压值
 ADC_temp-=ADC_Value;
 ADC_temp*=1000;
 LCD_ShowNum(172,200,ADC_temp,3,16);  //显示小数

}

 

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

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-6-26
在线时间
6 小时
 楼主| 发表于 2012-6-26 19:12:07 | 显示全部楼层
别只看不说话啊,我通道SQ14换成SQ1了,电压正常,难道我要测SQ14就要设置14个通道,把SQ14编号设为00000,然后一次次的转换SQ14?
回复 支持 反对

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-6-26
在线时间
6 小时
 楼主| 发表于 2012-6-26 22:52:06 | 显示全部楼层
每个通道都测了一下,只有PA0,PA1正常,其它的都不正常,不会是片子有问题吧!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-27 00:39:46 | 显示全部楼层
如果只有一个通道,你就只需要设置SQR3的SQ1即可.
然后设置SQ的通道=ADC14即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2012-6-26
在线时间
6 小时
 楼主| 发表于 2012-6-27 08:57:42 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哦,依你的说法,似乎明白些了。也就是说ADC的转换都是从SQ1-SQ16依次转换的,在SQ1里面设置第X个通道,那么第X通道将会第一个被转换。如果有3个通道那么就要设置SQ1-SQ3,是这样吧?我晚上回去试试,谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-27 11:50:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2011-11-4
在线时间
0 小时
发表于 2012-7-5 16:12:57 | 显示全部楼层
回复【楼主位】284616898:
---------------------------------
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
   //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
// ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
              
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5 );        
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5 );
       
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
 
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
请问一个问题,我想三个引脚进行AD采集,上面程序中开通了三个通道,return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果,,,那这里返回的是谁的结果啊?难道是三个通道的结果?或许这样写程序就是错的,糊涂中?请帮忙分析下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-5 20:26:08 | 显示全部楼层
回复【7楼】woshizu:
---------------------------------
你写哪个通道,就返回哪个的值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 14:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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