找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1718|回复: 4
打印 上一主题 下一主题
收起左侧

单片机+adc0809采集了电压和电流信号,但电压电流相乘结果错误

[复制链接]
跳转到指定楼层
楼主
通过adc0809采集了电压和电流信号,但是电压和电流相乘的结果会出错(大于6.多w就计算错误了)




  1. uchar ADC(uchar CH)   //AD转换程序
  2. {        
  3.         uchar n;               
  4.   if(CH==0)    //通道选择
  5. {   
  6.         ADDA=0;    //使用IN0
  7.   EOC=1;TR0=1;START=0;OE=0;DelayMS(5);
  8.         START=1;DelayMS(5);
  9.         START=0;
  10.         while(EOC==0);
  11.         OE=1;
  12.         n=P1;
  13.         DelayMS(1);
  14.         OE=0;
  15.         TR0=0;
  16.         return n;
  17.         }
  18.         else
  19. {
  20.         ADDA=1;   //使用IN1
  21.         EOC=1;TR0=1;START=0;OE=0;DelayMS(5);
  22.         START=1;DelayMS(5);
  23.         START=0;
  24.         while(EOC==0);
  25.         OE=1;
  26.         n=P1;
  27.         DelayMS(1);
  28.         OE=0;
  29.         TR0=0;
  30.         return n;
  31. }
  32.         }

  33. void change1()  //数据转换
  34. {  
  35.   x=ADC(0)*1.0*5/255*100*20;   //扩大100倍,方便计算显示
  36.   LCDDSY1[2]=x/1000+0x30;   //取每一位
  37.         LCDDSY1[3]=x%1000/100+0x30;
  38.         LCDDSY1[4]='.';
  39.         LCDDSY1[5]=x%100/10+0x30;
  40.         LCDDSY1[6]=x%10+0x30;
  41.         LCDDSY1[7]='v';
  42. }

  43. void change2()  //数据转换
  44. {
  45.   y=ADC(1)*1.0*5/255*100/5;
  46.         LCDDSY1[11]=y/100+0x30;
  47.         LCDDSY1[12]='.';
  48.         LCDDSY1[13]=y%100/10+0x30;
  49.         LCDDSY1[14]=y%10+0x30;
  50.         LCDDSY1[15]='A';
  51.         }




  52. void display2()   //显示程序2
  53. {        
  54.   uchar i;
  55.         change1();
  56.         Set_LCD_POS(0x00);i=0;   //设定初显示位置
  57.         while(LCDDSY1[i]!='\0')   //判断字符串是否结束,没结束则执行下方程序
  58.         {
  59.         Write_LCD_Data(LCDDSY1[i]); i++; //写数据
  60.         }
  61.         DelayMS(1);
  62.         
  63.         change2();
  64.         Set_LCD_POS(0x08);i=8;//设定初显示位置
  65.         while(LCDDSY1[i]!='\0')//判断字符串是否结束
  66.         {
  67.         Write_LCD_Data(LCDDSY1[i]);i++; //写数据
  68.         }
  69.         DelayMS(1);
  70.   z=x*y;
  71.         LCDDSY2[2]=z/100000+0x30; //取每一位数据
  72.         LCDDSY2[3]=z%100000/10000+0x30;
  73.         LCDDSY2[4]='.';
  74.         LCDDSY2[5]=z%10000/1000+0x30;
  75.         LCDDSY2[6]=z%1000/100+0x30;
  76.         LCDDSY2[7]='W';
  77.         Set_LCD_POS(0x40);i=0; //设定初显示位置
  78.         while(LCDDSY2[i]!='\0')  //判断字符串是否结束
  79.         {
  80.         Write_LCD_Data(LCDDSY2[i]);i++; // 写数据
  81.         }
  82.         }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-5-21 08:05 | 只看该作者
你的电压、电流结果都扩大了100倍,z=x*y;数据溢出而发生错误,正确算法:z=(long)x*(long)y/100;
回复

使用道具 举报

板凳
ID:904473 发表于 2021-5-26 20:51 | 只看该作者
wulin 发表于 2021-5-21 08:05
你的电压、电流结果都扩大了100倍,z=x*y;数据溢出而发生错误,正确算法:z=(long)x*(long)y/100;

非常感谢,可以算出正确值了,但是为什么后面还要除以100呢?另外我想提高电流的流程至10A,请问怎样处理呢?可以指导一下吗?谢谢!
回复

使用道具 举报

地板
ID:362692 发表于 2021-5-28 11:40 | 只看该作者
请问 可以提供下程序 源文件吗
回复

使用道具 举报

5#
ID:362692 发表于 2021-5-28 11:40 | 只看该作者
你好,请问可以提供下电流源文件吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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