找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机里自然对数如何写

[复制链接]
跳转到指定楼层
楼主
ID:1045846 发表于 2024-7-21 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

要计算两路电压的dB差,不在规格值时报警。
下面这种写法,编译没有报错,数码管上也没有数字显示出来。

高手帮忙看看问题出在哪。
感谢!
  1. //测量VR电压\dB程序
  2. void Voltage_VR(void)
  3. {
  4.         P1M0=0x32;P1M1=0x09;   //P1.1、P1.4、P1.5推挽(测试两端),P1.0、P1.3为高阻
  5.         ADCA=0;ADCC=0;ADCB=0;ADCD=1;ADCE=1;//AL、BL、CL、OH,P1.5
  6.         ADKA=0;ADKB=0;//aL、bL、cL
  7.         Delay500us();          //延时等待稳定
  8.         VinA=ADC_V(0x00);     //读取第0通道,R2层电压,1-2端
  9.         Delay500us();          //延时等待稳定
  10.         VinB=ADC_V(0x03);     //读取第0通道,R1层电压,1-2端
  11.        
  12.         // 判断电压,进行dB计算
  13.               dBA=(float)20*log(VinA/VCC);
  14.               dBB=(float)20*log(VinB/VCC);
  15.               dB=dBA-dBB;
  16.               if(dB>=-2.9 && VinA<=5100)
  17.                                 {
  18.                                         count=0; //计数清0
  19.                                 }
  20.                                 else if(dB<=2.9 && VinA<=5100)//else if(Vin>=4950 && Vin<=5000)
  21.                                 {
  22.                                         count=0; //计数清0
  23.                                 }
  24.                                 else //以上各分支条件都不成立,说明产品有缺陷
  25.                                 {
  26.                                         count++;
  27.                                         if(count>=2)//当到达10ms
  28.                                         {
  29.                                                 LEDG=1;           //绿灯熄
  30.                                                 LEDR=0;           //红灯亮
  31.                                                 alarm=1;
  32.                                                 while(alarm & RST)//取下VR或按RST键退出死循环,但报错发生在不取下VR的情况下按RST键复检当前档位
  33.                                                 {
  34.                                                         VR=exist_VR(0x05); //第5通道测量VR存在
  35.                                                         if(VR>=4000)alarm=0;//判断VR没有装,退出死循环

  36.                                                         if(count2==0)//闪烁周期250ms
  37.                                                         {
  38.                                              dis_buf[0]=~(table[dB%10]);
  39.                                  dis_buf[1]=~(table[dB/10%10]|0x80);
  40.                                        dis_buf[2]=~(table[25]);//'U'
  41.                                        dis_buf[3]=~(table[VinA/10%10]);
  42.                                        dis_buf[4]=~(table[VinA/100%10]);
  43.                                        dis_buf[5]=~(table[VinA/1000%10]|0x80);//加小数点
  44.                                                          dis_buf[6]=~(table[25]);//'U'
  45.                                        dis_buf[7]=~(table[VinB/10%10]);
  46.                                        dis_buf[8]=~(table[VinB/100%10]);
  47.                                        dis_buf[9]=~(table[VinB/1000%10]|0x80);//加小数点

  48.                                                                 DisplayScan();
  49.                                                         }
  50.                                                         if(count2==125)
  51.                                                         {
  52.                                                                 dis_buf[0]=~(table[16]);//不显示
  53.                                                                 dis_buf[1]=~(table[16]);
  54.                                                                 dis_buf[2]=~(table[16]);
  55.                                                                 dis_buf[3]=~(table[16]);
  56.                                                                 dis_buf[4]=~(table[16]);
  57.                                                                 dis_buf[5]=~(table[16]);
  58.                                                                 dis_buf[6]=~(table[16]);
  59.                                                                 dis_buf[7]=~(table[16]);
  60.                                                                 dis_buf[8]=~(table[16]);
  61.                                                                 dis_buf[9]=~(table[16]);
  62.                                                                 DisplayScan();
  63.                                                         }
  64.                                                         Delay_ms(1);
  65.                                                         count2=++count2%250;
  66.                                                 }
  67.                                                 count2=0;
  68.                                         }
  69.                                 }
  70.                                 LEDG=0;           //绿灯亮
  71.                                 LEDR=1;           //红灯熄
  72.                           dis_buf[0]=~(table[dB%10]);
  73.                           dis_buf[1]=~(table[dB/10%10]|0x80);
  74.                                 dis_buf[2]=~(table[25]);//'U'
  75.                                 dis_buf[3]=~(table[VinA/10%10]);
  76.                                 dis_buf[4]=~(table[VinA/100%10]);
  77.                                 dis_buf[5]=~(table[VinA/1000%10]|0x80);//加小数点
  78.                                 dis_buf[6]=~(table[25]);//'U'
  79.                                 dis_buf[7]=~(table[VinB/10%10]);
  80.                                 dis_buf[8]=~(table[VinB/100%10]);
  81.                                 dis_buf[9]=~(table[VinB/1000%10]|0x80);//加小数点
  82.                                 DisplayScan();           //显示电压值
  83.                         }
复制代码




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

使用道具 举报

沙发
ID:344848 发表于 2024-7-22 11:56 | 只看该作者
普通单片机乘除运算能力较差,别说自然对数了,建议将自然对数转化为表格形式,直接查表即可。这需要FLASH容量很大,才能确保精度!
回复

使用道具 举报

板凳
ID:1045846 发表于 2024-7-27 16:19 | 只看该作者
donglw 发表于 2024-7-22 11:56
普通单片机乘除运算能力较差,别说自然对数了,建议将自然对数转化为表格形式,直接查表即可。这需要FLASH ...

感谢提供方法。
只是本人初学,这种方法实施起来有难度。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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