将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条回答
FlamePoint
1楼-- · 2019-08-18 01:12
 精彩回答 2  元偷偷看……
yuzeyuan1
2楼-- · 2019-08-18 04:42
FlamePoint 发表于 2016-10-24 11:02
是在什么情况下出的这种问题啊 ?我最近也在弄AD转换,一直在用float,如果不用float的话应当如何实现呢 ...

具体原因不知道,当时是这样:
a[0]=(sx*sy-7*sxy)/(sx*sx-7*sx2);
a[1]=(sx2*sy-sx*sxy)/(7*sx2-sx*sx);
是一个最小二乘拟合的公式,分子分母都不是0,所有变量都是float型。
整个工程也只有这里是float,这里就是AD值经过各种+-*/得到的一些数,数值计算起来全都是六七位的小数,怕损精度还不敢去掉,如果都设成float就非常容易理解了,但是总得不到我想要的结果,于是我把公式一点一点儿拆开检查,最后发现是一个简单的加法得到的结果不对。
解决就是把小数变成整数,比如3.1415926变成31415926,所有计算都用int型,最后解析的时候记得除回来就好,至少不会出莫名其妙的错误。
FlamePoint
3楼-- · 2019-08-18 05:29
yuzeyuan1 发表于 2016-10-24 13:13
具体原因不知道,当时是这样:
a[0]=(sx*sy-7*sxy)/(sx*sx-7*sx2);
a[1]=(sx2*sy-sx*sxy)/(7*sx2-sx*sx ...

好吧,受教了。~
笨笨呆呆
4楼-- · 2019-08-18 08:12
yuzeyuan1 发表于 2016-10-24 13:13
具体原因不知道,当时是这样:
a[0]=(sx*sy-7*sxy)/(sx*sx-7*sx2);
a[1]=(sx2*sy-sx*sxy)/(7*sx2-sx*sx ...

我也给他转换成int型处理算法  再显示的时候强制转换成float。虽然有误差 但是不大
pray
5楼-- · 2019-08-18 08:58
楼主,能分享下你ADC两路采集的,ADC初始化配置吗?本人是个小白,两路ADC采样不怎么会配置。。

一周热门 更多>