OpenEdv-开源电子网

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

"DAC数模转换实验-M3"关于检测电压值奇怪的现象

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-3-22
在线时间
6 小时
发表于 2019-3-22 16:43:28 | 显示全部楼层 |阅读模式
1金钱
我在写“第48讲 DAC数模转换实验-M3”程序的时候,用的串口输出数据,其中DAC为DAC输出值,DAC VAL为计算电压值, ADC VAL为ADC检测电压值。
但是在DAC等于2600和3800的时候出现了奇怪的数据,2600的时候电压达到2.9V,3800的时候达到3.6V。最高不是3.3V吗?怎么会出现这种情况呢?
另外发现好像\n\r没作用?求助各位大佬解答~

下面是main函数里while循环的代码:
u8 KEY=0;
         u16 vol=0;
         u8 t=0;
         u16 adcx,n,m;
         float tmp;

while(1)
         {
                t++;
                KEY=KEY_Scan(0);
                if(KEY==KEY0_P)
                {
                        if(vol<4000)
                        {
                                vol+=200;                                               
                        }       
                        DAC_SetChannel1Data(DAC_Align_12b_R, vol);
                                       
                }
                if(KEY==KEY1_P)
                {
                        if(vol>=200)
                        {
                                vol-=200;                                               
                        }       
                        DAC_SetChannel1Data(DAC_Align_12b_R, vol);
                                       
                }
                if(t==100||(KEY==KEY0_P)||(KEY==KEY1_P))
                {
                        printf("1111\n\r");
                        adcx=DAC_GetDataOutputValue(DAC_Channel_1);
                        printf("DAC    : %d \n\r",adcx);
                        tmp=(float)adcx*(3.3/4096);                       
                        n=tmp;
                        tmp-=n;
                        tmp*=1000;
                        printf("DAC VAL: %d.%d\n\r",n,(int)tmp);
                       
                        adcx=Get_Average();
                        tmp=(float)adcx*(3.3/4096);
                        n=tmp;
                        m=(tmp-n)*1000;
                        printf("ADC VAL: %d.%d\n",n,m);
                        t=0;
                        LED0=!LED0;
                }
                delay_ms(100);
         }


串口输出截图

串口输出截图

最佳答案

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

tmp=(float)adcx*(3.3/4096); n=tmp; tmp-=n; tmp*=1000; printf("DAC VAL: %d.%d\n\r",n,(int)tmp); 这个算法是错的, 就拿3800来举例吧, 当adcx=3800时, tem= 3.0615..., 而tmp*=1000;之后, tmp=61, 但你应该打印出来的是3.061, 现在的方式打印出来的是3.61, “0”被偷走了? 建议你搜一下 printf的格式学习一下, 它是可以直接打印指定小数位的浮点小数, 不需要这样转换的, 直接用printf ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-22 16:43:29 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-22 23:17 编辑

tmp=(float)adcx*(3.3/4096);                       
n=tmp;
tmp-=n;
tmp*=1000;
printf("DAC VAL: %d.%d\n\r",n,(int)tmp);

这个算法是错的, 就拿3800来举例吧, 当adcx=3800时, tem= 3.0615..., 而tmp*=1000;之后, tmp=61, 但你应该打印出来的是3.061, 现在的方式打印出来的是3.61, “0”被偷走了?

建议你搜一下 printf的格式学习一下, 它是可以直接打印指定小数位的浮点小数, 不需要这样转换的, 直接用printf("DAC VAL: %.3f\n\r",tmp) 即可
回复

使用道具 举报

头像被屏蔽

18

主题

184

帖子

0

精华

禁止发言

积分
258
金钱
258
注册时间
2019-1-10
在线时间
10 小时
发表于 2019-3-22 16:59:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-3-22 19:43:11 | 显示全部楼层
参考电压 有接上吗  还有是\r\n不是\n\\r.....
啊哈~加油!!
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-3-22
在线时间
6 小时
 楼主| 发表于 2019-3-22 22:01:56 | 显示全部楼层
翼行园子 发表于 2019-3-22 19:43
参考电压 有接上吗  还有是\r\n不是\n\\r.....

我其他数据都正常,就2600和3800的两个异常。。。。
我是\n\r啊
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-3-22
在线时间
6 小时
 楼主| 发表于 2019-3-23 19:44:56 | 显示全部楼层
edmund1234 发表于 2019-3-22 16:43
tmp=(float)adcx*(3.3/4096);                       
n=tmp;
tmp-=n;

原来如此!多谢大佬!

但是\n\r在串口不会换行呢咋回事
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-23 23:37:42 | 显示全部楼层
aloneweiwei 发表于 2019-3-23 19:44
原来如此!多谢大佬!

但是\n\r在串口不会换行呢咋回事

写反了, 是\r\n
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 12:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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