OpenEdv-开源电子网

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

用TFTLCD(ID9341)显示电压增益的问题

[复制链接]

3

主题

9

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-2
在线时间
6 小时
发表于 2017-8-2 09:38:23 | 显示全部楼层 |阅读模式
1金钱
请问:用DAC1_OUT(PA4)输出一个电压,然后将3.3V电压通过ADC123_IN1(PA1)输入,然后用TFTLCD(ID9341)显示电压增益:20*log10(ADC123_IN1/DAC1_OUT),代码是采用教程源码DAC实验部分,只是在获取ADC的值之后加了一句:temp=20*log10(adcx/dacx);//计算电压增益;在输出电压小于0.966V之前电压增益都是0dB,输出电压大于0.996V后电压增益不为零,但是不正确,这个是什么原因呢?求指正,感谢!
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "key.h"
#include "dac.h"
#include "math.h"


          
int main(void)
{
        u16 adcx;
        u16 dacx;
        float temp;
        u8 t=0;         
        u16 dacval=0;
        u8 key;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        delay_init();                     //延时函数初始化          
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD                
        KEY_Init();                                //按键初始化                        
        Adc_Init();                                  //ADC初始化
        Dac1_Init();                         //DAC通道1初始化       
  
        LCD_Clear(WHITE);//设置背景色
         
        POINT_COLOR=RED;//设置字体为红色
        LCD_ShowString(36,50,200,16,16,"Voltage Gain Display");        //第一个参数是行的位置,第二个参数是列的位置,第三个参数是区域的长,第四个参数是区域的高,第五个参数是字体的大小
        LCD_ShowString(100,70,200,16,16,"TEST");       
        //LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,90,200,16,16,"Time:2017/8/1");       
        LCD_ShowString(60,110,200,16,16,"WK_UP:+  KEY0:-");       
        //显示提示信息                                                                                             
        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(60,150,200,16,16,"DAC VAL:");             
        LCD_ShowString(60,170,200,16,16,"DAC VOL:  0.000 V");             
        LCD_ShowString(60,190,200,16,16,"VOL GAIN: 0.000 dB");            
        DAC_SetChannel1Data(DAC_Align_12b_R, 0);//12位右对齐数据格式设置DAC初始值                        
        while(1)
        {
                t++;
                key=KEY_Scan(0);                          
                if(key==WKUP_PRES)
                {                 
                        if(dacval<4000)dacval+=200;
                        DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?
                }else if(key==KEY0_PRES)       
                {
                        if(dacval>200)dacval-=200;
                        else dacval=0;
                        DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//??DAC?
                }         
                if(t==10||key==KEY0_PRES||key==WKUP_PRES)         //WKUP/KEY1按下了,或者定时时间到了
                {          
                        dacx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
                        LCD_ShowxNum(124,150,dacx,4,16,0);             //显示DAC寄存器值
                        temp=(float)dacx*(3.3/4096);                        //得到DAC电压值
                        dacx=temp;
                        LCD_ShowxNum(140,170,temp,1,16,0);             //显示整数部分
                        temp-=dacx;
                        temp*=1000;
                        LCD_ShowxNum(156,170,temp,3,16,0X80);         //显示小数部分
                       
                        adcx=Get_Adc_Average(ADC_Channel_1,10);                //得到ADC转换值          
                        temp=(float)adcx*(3.3/4096);                        //得到ADC电压值
                       
                        temp=20*log10(adcx/dacx);//计算电压增益
                       
                        adcx=temp;
                        LCD_ShowxNum(140,190,temp,1,16,0);             //显示电压值整数部分
                        temp-=adcx;
                        temp*=1000;
                        LCD_ShowxNum(156,190,temp,3,16,0X80);         //显示电压值的小数部分
                        LED0=!LED0;          
                        t=0;
                }            
                delay_ms(10);        [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

小于1,增益是负数。 这种纯计算问题,就不需要太多问了。 自己去看各个变量的值,然后公式不要写成adc/dac这样,你看不到转换后的结果。 可以写成adc=adc/dac 然后你看adc是多少,然后慢慢分析问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-8-2 09:38:24 | 显示全部楼层
Execllent 发表于 2017-8-6 17:25
请问应该怎么改正让小于1V时也有电压增益呢,大于0.966V后的增益为什么不正确呢?

小于1,增益是负数。
这种纯计算问题,就不需要太多问了。
自己去看各个变量的值,然后公式不要写成adc/dac这样,你看不到转换后的结果。
可以写成adc=adc/dac
然后你看adc是多少,然后慢慢分析问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-2
在线时间
6 小时
 楼主| 发表于 2017-8-2 11:21:42 | 显示全部楼层
DAC的教程中是将输入和输出连在一起,LCD屏幕上就可以显示输出和输出的电压,经过运算怎么就显示不出来了呢?
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-2
在线时间
6 小时
 楼主| 发表于 2017-8-2 11:29:44 | 显示全部楼层
大家有没有用TFTLCD显示电压增益的实验呢?谢谢!
回复

使用道具 举报

15

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-7-23
在线时间
32 小时
发表于 2017-8-3 17:17:32 | 显示全部楼层
楼主你是参加了电赛吗?
回复

使用道具 举报

15

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-7-23
在线时间
32 小时
发表于 2017-8-5 21:50:48 | 显示全部楼层
因为你temp=20*log10(adcx/dacx)试中的dacx此时只是整数部分的值,当你输出电压小于0.966V,时整数部分为0,所以显示的增益为0
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-2
在线时间
6 小时
 楼主| 发表于 2017-8-6 17:25:33 | 显示全部楼层
学习32 发表于 2017-8-5 21:50
因为你temp=20*log10(adcx/dacx)试中的dacx此时只是整数部分的值,当你输出电压小于0.966V,时整数部分为0 ...

请问应该怎么改正让小于1V时也有电压增益呢,大于0.966V后的增益为什么不正确呢?
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-8-2
在线时间
6 小时
 楼主| 发表于 2017-8-7 09:15:40 | 显示全部楼层
正点原子 发表于 2017-8-2 09:38
小于1,增益是负数。
这种纯计算问题,就不需要太多问了。
自己去看各个变量的值,然后公式不要写成adc ...

谢谢,小于1V电压的时候,另一路输入是3.3V,增益是正的,这个是什么导致增益显示错误呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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