这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 又有问题,R8C/2B, 有关A/D 转换

共9条 1/1 1 跳转至

又有问题,R8C/2B, 有关A/D 转换

菜鸟
2008-06-12 16:14:41     打赏

小弟在使用R8C/2B的芯片做到A/D转换的时候,又被卡住了。
有碰上过相同情况吗?提供个经验,谢谢啊
大概的情况:
Vref连接供电电源,3.3V
选择AN9(p1_1) 作输入电压,是经过电池连接两个电阻到地1/2分压过来。
电池电压大概3.8V,分压处大概是1.9V。这个1.9V是在AN9 没有连接的时候
读的,跟预想的一样
硬件连接上AN9 之后,有几种情况
1.AN9 处的电压被拉高,接近Vref的值,10BIT精度读出来1012。
   这种情况具体是什么配置造成的还不是很清楚,是把A/D转换集成到整个程序中发现的

2.AN9的电压被拉低,电压低到0.5V左右,读出来的值在175左右。
   下面的程序配置
3.电压会被拉低到0,读出来的值只有0或者1。
跟情况2差不多的配置,差别在Sfr配置的时候将pd1_2设置成1


相关源码:
void ADconvert_Sfr_init()
{
 
 pd1_1=0;
 #if 1 
 
 //adgsel0=1;  //选择AN8~AN11
 adcon0=0x05;  //引脚AN9,单次模式,选择f4

 adcon1=0x28;  //连接Vref。10位精度
 //adcon1=0x20;//8bit

 adcon2=0x09;
 
 
 adic=0x00;  //中断禁止
 #else
  #endif
 
}

UINT16 ReadBatt(void)
{
 UINT16 batt;
 UINT8 i;
 pu02=0;  
 pd1=0x00;//如果没有句,就会变成情况3
 ADconvert_Sfr_init(); 
 for(i=0;i<20;i++)
 {
  asm("NOP");
 }
 
 adst=1;
 while(adst==1);
 
 batt=(ad0&0x03ff); 
 //pu02=1;
 return batt;
 
}




关键词: 有问题     有关     转换    

菜鸟
2008-06-12 17:04:51     打赏
2楼
从你的程序来看,设置应该没有什么问题,请确认一下:1、不运行程序,硬件接上后AN9处电压是否稳定?确定是硬件问题还是软件问题。2、确定P1_0~P1_3这几个引脚除了AN9外,还连接了什么信号,最好把除了P1_1外的其它信号断开。

菜鸟
2008-06-13 17:19:55     打赏
3楼

谢谢Drive78
今天检查了下,发现AN9连接采样电压的话,即使不给MCU复位,电压也会被拉低,
这样子怀疑跟芯片引脚内部电路有关,然后试了AN6这个引脚,发现正常的,
现在就用AN6吧


助工
2008-06-13 17:59:59     打赏
4楼
虽然使用AN6解决了AD转换值准确的问题,还是建议您查查硬件电路,或找到真正的原因,系统才更安全可靠。
刚才你提示用AN9与AN6,在你提供的程序中:
//adgsel0=1;  //选择AN8~AN11 

而选择AN9必须选择adgsel0=1。

另外,除了Driver78的建议外,AD电压采样处的两个电阻是否太大?AN9端子处是否对地有短路?软硬件结合查一下,把已经发现的问题clear掉。一般这种情况下个人的调试经验是,先不怀疑芯片引脚内部电路问题,而是要怀疑对内部电路的设定是否正确。


菜鸟
2008-06-30 17:57:36     打赏
5楼
 谢谢renesasstk,
现在板子已经不在我手上,不过下个项目也还是用的瑞萨的芯片,还可以继续看看.

之前我考虑的情况是这样
1.因为相同的外部电路在AN6 上可以正常,那我觉得不应该是电阻太大的问题, 
如果电阻太大我需要调节电阻的话,这样子我觉得应用起来会非常不方便.
2.短路的问题,也考虑过, 之前这个AN9是做输出使用的,可以正常拉高的,

现在更多的原因可能真的是软件配置的问题.下一个板子再仔细查查.



助工
2008-07-04 12:28:31     打赏
6楼

问题在于你刚刚设定adgsel0 = 1后马上把adcon0的值设定为0x05,这样adgsel0不是又被设定为了0么。使用AN8~AN11,比如你现在想用的AN9,必须把adgsel0设定为1。
正确的初始程序如下:

void InitAD( )
{
    
}


助工
2008-07-04 12:36:36     打赏
7楼
刚才没有写完。
你的程序中没有设定adgsel0。因为你最后一次操作adcon0时写的是0x05,所以adgsel0的值是1,但是使用AN8~AN11必须将adgsel0设定为1。

正确的程序如下:
void InitAD( )
{
     pd1_2 = 0;
     adcon0 = 0x05;     //单次模式,AN9,f4
     adcon1 = 0x28;     //连接Vref,10位模式(原则上连接Vref后到第一adst = 1需要等待1us给Vref充电)
     adcon2 = 0x09;     //需要采样保持么?一般这个功能在连续模式下比较有用
     adic = 0x00;           //不使用中断
}

菜鸟
2008-07-31 16:15:14     打赏
8楼

renesaschina
     你的代码和我最上面的代码并没有区别啊,
还有一个adgsel0是寄存器ADCON2的bit3,我设置ADCON2=0x09,这样
adgsel0已经被置位了。
我用的芯片是R8C /2B系列的,我手头上的资料 rcj09b0048_r8c2a2bhm.pdf
因为你的观点和renesasstk一样的。


还有个问题

我先前使用的编译器是试用版的,现在过期了,我要继续使用的话是不是要买一个许可了?
或者有办法继续使用吗?


菜鸟
2008-07-31 17:27:15     打赏
9楼

你的程序是没有问题,我想硬件问题的可能性很大。
你的上种情况分析如下:
1 连接后值接近于Vref
   如果只有MCU工作后才发生,那么一般2种可能:
   a   pd1_2 = p1_2 = 1  端口输出H
   b   pd1_2 = pu0_2 = 1 端口数入,但是启用内部上拉,并且你外接的分压电阻过大(1M?)

2 估计是硬件问题,不好说,或者引脚复用了。 
3 输出L。


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]