打印

有没会C8051F410的大神呢?电源电压ADC测量的数据一直在上涨变化,找不到原因

[复制链接]
42507|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/*ADC初始化*/
void ADC_Init()
{
  ADC0MX    = 0x12;             //P2.2模拟输入
  ADC0CF    = 0x00;                 //转换时间周期控制,复位值0xF0;
  ADC0CN    = 0x02;             //AD0EN=0,ADC0 Burst Mode closed,CN上升启动中断,右对齐
  ADC0TK    = 0xF9;      //Pre-tracking mode  F8  3个    F9  4
}
/*引脚定义*/
void Port_IO_Init()
{
    P0MDIN    = 0xFD;         //P0.1 模拟输入 MISO  0.5不能配置成模拟输出,否则接收不到数据
   P1MDIN    = 0xFB;             //P1.2 Vref模拟输入
    P2MDIN    = 0xFB;        //P2.2 ADC

    P0MDOUT   = 0x9D;        //P0.3,P0.4Tx,P0.7LYreset P0.0(SCK),P0.2(MOSI)推免输出
    P1MDOUT   = 0x40;        //P1.6 SPI CS 推免输出        
    P2MDOUT   = 0x1B;        //P2.0 SHT11 HTSCK,P2.1 SHT11 HTDATA,P2.3 GATE,P2.4 LY WK
        
    P1SKIP    = 0x07;                 //X1,X2,Vref跳过
    P2SKIP    = 0x04;        //ADC跳过
        
    XBR0      = 0x03;                 //UART0连接到端口
    XBR1      = 0x50;                 //使能
}
/********中断初始化********/
void Interrupts_Init()
{
  EIE1      = 0x08;                      //ADC转换结束中断使能
  IE        = 0x30;                          //UART0中断使能 TIME2
  ES0=1;
}
/********中断********/
void ADC_INTI(void) interrupt 10
{
    float Volt;
    AD0INT=0;  
    ADCtemp=(ADC0H&0xFFFF)<<8|ADC0L;
        if(ADCTimes<32)                         //转换16次,每秒钟可转换25次
   {
    AddADCtemp=AddADCtemp+ADCtemp;
    ADCTimes++;
    AD0BUSY=1;
    return;
   }
   AD0BUSY=0;
   AddADCtemp = AddADCtemp>>5;
   Volt = AddADCtemp;             //电压转换系数         
    DataTable[1]=Volt;
   ADCTimes=0;
   AddADCtemp=0;
   AD0EN  = 0;                                 //关闭ADC,以便节省功耗
   EIE1  &=0xF7;                               //关闭ADC中断  
}
//测量电池电压函数,主函数直接调用
void MeasurePower()
{
  EIE1   |= 0x08;              //开启ADC中断
  ADC0CN  = 0x00;              //AD0EN=0,低功耗模式,Buzy写1启动转换
  AD0EN      =  1;                 //使能ADC
  AddADCtemp =  0;
  ADCTimes   =  0;
  AD0BUSY    =  1;                   //启动一次转换  Delay(1000);
  EIE1   |= 0x08;             //启动ADC0转换结束中断  
}


引脚不够用了,定时器用了两个,也没相关参考程序,用的busy写1中断

相关帖子

沙发
jjjyufan| | 2018-7-31 16:38 | 只看该作者
硬件图上个看看

使用特权

评论回复
板凳
tyw| | 2018-7-31 17:11 | 只看该作者
C8051F410混合信号ISP FLASH微控制器数据手册 240页 3.7M 超清书签版.pdf (3.67 MB)
基于单片机的超声波液位测量毕业设计.pdf (281.48 KB)
单片机实践课件10电科131402.pdf (7.24 MB)
基于C8051F410单片机的12864带字库点阵LCD显示器设计.pdf (201.38 KB)
基于C8051F410的热偶信号发生器的设计.pdf (748.35 KB)
C8051f410模数与数模转换器配置实验.pdf (166.38 KB)
C8051F410实验指导书(2012).pdf (1.34 MB)
C8051F410学习笔记.pdf (63.13 KB)
C8051f410串口通信接口设计实验.pdf (226.91 KB)
C8051F410单片机的设计(20180731164912).pdf (329.47 KB)
基于C8051F410的任意波形发生器.pdf (3.75 MB)
C8051F410单片机的设计.pdf (319.49 KB)
C8051F410例程简介.pdf (26.57 KB)


使用特权

评论回复
评论
小鱼儿1045 2018-8-1 08:53 回复TA
T叔每次一言不合就向对方扔来一堆书~ 
809965167 2018-7-31 17:26 回复TA
网上搜了下,自己弄着根本不对,着程序我是参照我产业化商品主芯片C8051F340的程序改的,但ADC0H和ADC0L的值一直在往上涨 
地板
cainiao518| | 2018-7-31 17:14 | 只看该作者
测一下AD管脚的电压是否变化

使用特权

评论回复
5
大秦正声| | 2018-7-31 17:16 | 只看该作者
2008年左右这款芯片已经出来了。

使用特权

评论回复
6
大秦正声| | 2018-7-31 17:17 | 只看该作者
参考官方例程,可以到silabs网站下载。

使用特权

评论回复
评论
809965167 2018-7-31 17:29 回复TA
在哪个位置能招到这些例程呢 
809965167 2018-7-31 17:20 回复TA
具体是在哪个位置下载呢 
7
809965167|  楼主 | 2018-7-31 17:17 | 只看该作者

分压了,VBAT 3.8供电,我分压了,两个20K的电阻

ANEHDBAP5RWOV3AU~R@`D%0.png (12.59 KB )

ANEHDBAP5RWOV3AU~R@`D%0.png

5NUIC3YHGD@_MOV3M(~N)Y9.png (63.31 KB )

5NUIC3YHGD@_MOV3M(~N)Y9.png

使用特权

评论回复
8
大秦正声| | 2018-7-31 17:18 | 只看该作者
内部adc记得12位。

使用特权

评论回复
9
大秦正声| | 2018-7-31 17:18 | 只看该作者
12位分辨率,还有dac

使用特权

评论回复
评论
809965167 2018-7-31 17:28 回复TA
对啊,老芯片了,引脚也少。毕设要用这个,网上参考资料也少,唉。 
10
809965167|  楼主 | 2018-7-31 17:21 | 只看该作者
cainiao518 发表于 2018-7-31 17:14
测一下AD管脚的电压是否变化

没有变化,耗电量低,就一个显示数字的液晶屏,没其他耗电的东西了。

使用特权

评论回复
11
cainiao518| | 2018-7-31 18:27 | 只看该作者
809965167 发表于 2018-7-31 17:21
没有变化,耗电量低,就一个显示数字的液晶屏,没其他耗电的东西了。

AD脚可以加一个电容,让电压稳定一点

使用特权

评论回复
评论
809965167 2018-8-2 12:29 回复TA
我现在的情况是电压测得值从0x08df左右,值就一直往上涨。比如测得值显示1023,1030,1024,1037,1033,。。。数值虽然在来回跳动,但值却是慢慢上涨到4095,然后保持4095不变 
12
ranli55| | 2018-7-31 19:10 | 只看该作者
void ADC_INTI(void) interrupt 10
{
    float Volt;
    AD0INT=0;  
    ADCtemp=(ADC0H&0xFFFF)<<8|ADC0L;
        if(ADCTimes<32)                         //转换16次,每秒钟可转换25次
   {
    AddADCtemp=AddADCtemp+ADCtemp;
    ADCTimes++;
    AD0BUSY=1;
    return;
   }
   AD0BUSY=0;
   AddADCtemp = AddADCtemp>>5;
   Volt = AddADCtemp;             //电压转换系数         
    DataTable[1]=Volt;
   ADCTimes=0;
   AddADCtemp=0;
   AD0EN  = 0;                                 //关闭ADC,以便节省功耗
   EIE1  &=0xF7;                               //关闭ADC中断  
}

ADCTimes 始终为0 一直在累加 肯定是一直上涨啊

使用特权

评论回复
13
大秦正声| | 2018-7-31 21:03 | 只看该作者
这个芯片以前用的很多的!

使用特权

评论回复
14
大秦正声| | 2018-7-31 21:04 | 只看该作者
www.silabs.com官网地址,资料和软件例程很多。

使用特权

评论回复
15
809965167|  楼主 | 2018-8-2 12:17 | 只看该作者
ranli55 发表于 2018-7-31 19:10
void ADC_INTI(void) interrupt 10
{
    float Volt;

if里面有个return ,没满32直接跳出中断的。不会把那个归零

使用特权

评论回复
16
cainiao518| | 2018-8-2 13:06 | 只看该作者
一直在累加?

使用特权

评论回复
评论
809965167 2018-8-3 15:59 回复TA
@cainiao518 :但我不知道是哪设置错了,能帮忙看看嘛 
cainiao518 2018-8-3 08:32 回复TA
@809965167 :既然累加,数据肯定是一直上涨啊 
809965167 2018-8-3 08:28 回复TA
对 
17
cjseng| | 2018-8-3 17:06 | 只看该作者
809965167 发表于 2018-7-31 17:17
分压了,VBAT 3.8供电,我分压了,两个20K的电阻

基准电压哪来的?

使用特权

评论回复
评论
809965167 2018-8-5 17:21 回复TA
@cjseng :内部提供啊,但感觉加了也没什么用。实在不行,我用定时器中断试试 
cjseng 2018-8-5 16:11 回复TA
@809965167 :P1.2的参考电压哪来的?内部产生的,还是要外部提供? 
809965167 2018-8-5 13:41 回复TA
后面我加了个REF0CN = 0x10;,参考P1.2引脚参考电压,还是不对 
18
cainiao518| | 2018-8-3 17:41 | 只看该作者
试试每次数据保存到数组里,满32次再累加求平均

使用特权

评论回复
19
809965167|  楼主 | 2018-8-5 13:43 | 只看该作者
cainiao518 发表于 2018-8-3 17:41
试试每次数据保存到数组里,满32次再累加求平均

我调试的时候, ADCtemp=(ADC0H&0xFFFF)<<8|ADC0L;这个也在上涨,是最开始测得的数据就有问题

使用特权

评论回复
20
809965167|  楼主 | 2018-8-13 11:45 | 只看该作者
帮帮忙啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝