OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3861|回复: 11

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

[复制链接]

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-6-8
在线时间
10 小时
发表于 2016-10-15 14:54:45 | 显示全部楼层 |阅读模式
1金钱
#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;//设置字体为红色
        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;//设置字体为蓝色
        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);       
        }                                                                                            
}       


这个是主程序。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-6-8
在线时间
10 小时
 楼主| 发表于 2016-10-15 14:56:06 | 显示全部楼层
这个是继续上次的问题发的  上次有个大神指点了 不知道相乘的结果是不是对的。但是我编译后的送到显示屏山的值是不精准的。不知道为什么。
回复

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2016-4-7
在线时间
96 小时
发表于 2016-10-15 15:24:09 | 显示全部楼层
最好DEBUG调试一下看看计算结果。。。浮点数进行计算本来就不准吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-10-18 22:32:09 | 显示全部楼层
一个乘法没那么难吧。。。
回复

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-6-8
在线时间
10 小时
 楼主| 发表于 2016-10-22 12:37:47 | 显示全部楼层
正点原子 发表于 2016-10-18 22:32
一个乘法没那么难吧。。。

一路累加的AD值和一个固定的AD值相乘了  在不断累加的过程中  误差越来越大。。。  
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-22 15:18:33 | 显示全部楼层
笨笨呆呆 发表于 2016-10-22 12:37
一路累加的AD值和一个固定的AD值相乘了  在不断累加的过程中  误差越来越大。。。

这个感觉别人帮你看不了,每个AD值读出来做过什么处理都要清楚,左移右移是否会损精度。个人建议不要用double和float,出过错,原因不详(比如计算个1.1*2都能算错),明明应该算出来的值结果却一塌糊涂,我前阵子计算过一个很大很大的数,定义了一个32位的数据,而实际计算时由于各种损精度,计算结果已经不能用了。
自在随心
回复

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-6-8
在线时间
10 小时
 楼主| 发表于 2016-10-23 13:29:22 | 显示全部楼层
yuzeyuan1 发表于 2016-10-22 15:18
这个感觉别人帮你看不了,每个AD值读出来做过什么处理都要清楚,左移右移是否会损精度。个人建议不要用do ...

这个就有点尴尬了。。。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
发表于 2016-10-24 11:02:59 | 显示全部楼层
yuzeyuan1 发表于 2016-10-22 15:18
这个感觉别人帮你看不了,每个AD值读出来做过什么处理都要清楚,左移右移是否会损精度。个人建议不要用do ...

是在什么情况下出的这种问题啊 ?我最近也在弄AD转换,一直在用float,如果不用float的话应当如何实现呢?
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-10-24 13:13:55 | 显示全部楼层
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型,最后解析的时候记得除回来就好,至少不会出莫名其妙的错误。
自在随心
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-9-26
在线时间
23 小时
发表于 2016-10-24 13:44:51 | 显示全部楼层
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 ...

好吧,受教了。~
回复

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2016-6-8
在线时间
10 小时
 楼主| 发表于 2016-10-24 16:21:50 | 显示全部楼层
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。虽然有误差 但是不大
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-5-28
在线时间
1 小时
发表于 2017-7-4 10:05:50 | 显示全部楼层
楼主,能分享下你ADC两路采集的,ADC初始化配置吗?本人是个小白,两路ADC采样不怎么会配置。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-17 05:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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