标题:
单片机里自然对数如何写
[打印本页]
作者:
jony1122
时间:
2024-7-21 20:47
标题:
单片机里自然对数如何写
要计算两路电压的dB差,不在规格值时报警。
下面这种写法,编译没有报错,数码管上也没有数字显示出来。
高手帮忙看看问题出在哪。
感谢!
//测量VR电压\dB程序
void Voltage_VR(void)
{
P1M0=0x32;P1M1=0x09; //P1.1、P1.4、P1.5推挽(测试两端),P1.0、P1.3为高阻
ADCA=0;ADCC=0;ADCB=0;ADCD=1;ADCE=1;//AL、BL、CL、OH,P1.5
ADKA=0;ADKB=0;//aL、bL、cL
Delay500us(); //延时等待稳定
VinA=ADC_V(0x00); //读取第0通道,R2层电压,1-2端
Delay500us(); //延时等待稳定
VinB=ADC_V(0x03); //读取第0通道,R1层电压,1-2端
// 判断电压,进行dB计算
dBA=(float)20*log(VinA/VCC);
dBB=(float)20*log(VinB/VCC);
dB=dBA-dBB;
if(dB>=-2.9 && VinA<=5100)
{
count=0; //计数清0
}
else if(dB<=2.9 && VinA<=5100)//else if(Vin>=4950 && Vin<=5000)
{
count=0; //计数清0
}
else //以上各分支条件都不成立,说明产品有缺陷
{
count++;
if(count>=2)//当到达10ms
{
LEDG=1; //绿灯熄
LEDR=0; //红灯亮
alarm=1;
while(alarm & RST)//取下VR或按RST键退出死循环,但报错发生在不取下VR的情况下按RST键复检当前档位
{
VR=exist_VR(0x05); //第5通道测量VR存在
if(VR>=4000)alarm=0;//判断VR没有装,退出死循环
if(count2==0)//闪烁周期250ms
{
dis_buf[0]=~(table[dB%10]);
dis_buf[1]=~(table[dB/10%10]|0x80);
dis_buf[2]=~(table[25]);//'U'
dis_buf[3]=~(table[VinA/10%10]);
dis_buf[4]=~(table[VinA/100%10]);
dis_buf[5]=~(table[VinA/1000%10]|0x80);//加小数点
dis_buf[6]=~(table[25]);//'U'
dis_buf[7]=~(table[VinB/10%10]);
dis_buf[8]=~(table[VinB/100%10]);
dis_buf[9]=~(table[VinB/1000%10]|0x80);//加小数点
DisplayScan();
}
if(count2==125)
{
dis_buf[0]=~(table[16]);//不显示
dis_buf[1]=~(table[16]);
dis_buf[2]=~(table[16]);
dis_buf[3]=~(table[16]);
dis_buf[4]=~(table[16]);
dis_buf[5]=~(table[16]);
dis_buf[6]=~(table[16]);
dis_buf[7]=~(table[16]);
dis_buf[8]=~(table[16]);
dis_buf[9]=~(table[16]);
DisplayScan();
}
Delay_ms(1);
count2=++count2%250;
}
count2=0;
}
}
LEDG=0; //绿灯亮
LEDR=1; //红灯熄
dis_buf[0]=~(table[dB%10]);
dis_buf[1]=~(table[dB/10%10]|0x80);
dis_buf[2]=~(table[25]);//'U'
dis_buf[3]=~(table[VinA/10%10]);
dis_buf[4]=~(table[VinA/100%10]);
dis_buf[5]=~(table[VinA/1000%10]|0x80);//加小数点
dis_buf[6]=~(table[25]);//'U'
dis_buf[7]=~(table[VinB/10%10]);
dis_buf[8]=~(table[VinB/100%10]);
dis_buf[9]=~(table[VinB/1000%10]|0x80);//加小数点
DisplayScan(); //显示电压值
}
复制代码
作者:
donglw
时间:
2024-7-22 11:56
普通单片机乘除运算能力较差,别说自然对数了,建议将自然对数转化为表格形式,直接查表即可。这需要FLASH容量很大,才能确保精度!
作者:
jony1122
时间:
2024-7-27 16:19
donglw 发表于 2024-7-22 11:56
普通单片机乘除运算能力较差,别说自然对数了,建议将自然对数转化为表格形式,直接查表即可。这需要FLASH ...
感谢提供方法。
只是本人初学,这种方法实施起来有难度。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1