将2路adc采样的结果相乘后送去显示 结果显示不精准。求大神看看

2019-08-17 03:56发布

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"

//ALIENTEK Mini STM32开发板范例代码15
//ADC实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
  u8 Buf[30];        
        u8 Buf1[30];
        u8 Buf2[30];
  u8 Buf3[30];
int main(void)
{
        u32 adcx=0;
        u32 adcx1=0;
        u32 adcx2=0;
        //u32 Vol4=0;
        float Vol=0;
        float Vol1=0;
        float Vol2=0;
        float Vol3=0;
        float dianliang=0;
        delay_init();                     //延时函数初始化          
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();
        Adc_Init();                 //ADC初始化                         
        POINT_COLOR=RED;//设置字体为红 {MOD}
        LCD_ShowString(60,50,200,16,16,"Mini STM32");       
        LCD_ShowString(60,70,200,16,16,"ADC TEST");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,200,16,16,"2014/3/9");       
        //显示提示信息
        POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
        LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");             
        LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");       
        LCD_ShowString(60,170,200,16,16,"ADC_CH2_VOL:0.000V");       
        LCD_ShowString(60,190,200,16,16,"ADC_CH3_VOL:0.000V");               
        LCD_ShowString(60,210,200,16,16,"ADC_CH3_ADD:0.000V");                 
        while(1)
        {
                adcx+=Get_Adc_Average(ADC_Channel_1,10);
                LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
                Vol=(float)adcx*3.3/4096;
                sprintf((char*)Buf,"%.3fV   ",Vol);
                LCD_ShowString(156,150,200,16,16,Buf);
               
               
                adcx1+=Get_Adc_Average1(ADC_Channel_2,10);
                LCD_ShowxNum(156,130,adcx1,4,16,0);//显示ADC的值
                Vol1=(float)adcx1*3.3/4096;
                sprintf((char*)Buf1,"%.3fV   ",Vol1);
                LCD_ShowString(156,170,200,16,16,Buf1);
               
               
                adcx2=Get_Adc_Average2(ADC_Channel_3,10);
                LCD_ShowxNum(156,130,adcx2,4,16,0);//显示ADC的值
                Vol2=(float)adcx2*3.3/4096;
                sprintf((char*)Buf2,"%.3fV   ",Vol2);
                LCD_ShowString(156,190,200,16,16,Buf2);
               
               

                dianliang=Vol1*Vol2;
               
                LCD_ShowxNum(156,130,dianliang,4,16,0);//显示ADC的值
                Vol3=(float)dianliang*3.3/4.096;
                sprintf((char*)Buf3,"%.3fV   ",Vol3);
                LCD_ShowString(156,210,200,16,16,Buf3);
               
                LED0=!LED0;
                delay_ms(100);       
        }                                                                                            
}       


这个是主程序。。。。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
笨笨呆呆
1楼-- · 2019-08-17 07:57
这个是继续上次的问题发的  上次有个大神指点了 不知道相乘的结果是不是对的。但是我编译后的送到显示屏山的值是不精准的。不知道为什么。
小wu
2楼-- · 2019-08-17 10:02
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-08-17 12:35
一个乘法没那么难吧。。。
笨笨呆呆
4楼-- · 2019-08-17 14:57
正点原子 发表于 2016-10-18 22:32
一个乘法没那么难吧。。。

一路累加的AD值和一个固定的AD值相乘了  在不断累加的过程中  误差越来越大。。。  
yuzeyuan1
5楼-- · 2019-08-17 19:23
笨笨呆呆 发表于 2016-10-22 12:37
一路累加的AD值和一个固定的AD值相乘了  在不断累加的过程中  误差越来越大。。。

这个感觉别人帮你看不了,每个AD值读出来做过什么处理都要清楚,左移右移是否会损精度。个人建议不要用double和float,出过错,原因不详(比如计算个1.1*2都能算错),明明应该算出来的值结果却一塌糊涂,我前阵子计算过一个很大很大的数,定义了一个32位的数据,而实际计算时由于各种损精度,计算结果已经不能用了。
笨笨呆呆
6楼-- · 2019-08-18 00:13
yuzeyuan1 发表于 2016-10-22 15:18
这个感觉别人帮你看不了,每个AD值读出来做过什么处理都要清楚,左移右移是否会损精度。个人建议不要用do ...

这个就有点尴尬了。。。

一周热门 更多>