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

2019-07-21 03:58发布

我在写“第48讲 DAC数模转换实验-M3”程序的时候,用的串口输出数据,其中DAC为DAC输出值,DAC VAL为计算电压值, ADC VAL为ADC检测电压值。
但是在DAC等于2600和3800的时候出现了奇怪的数据,2600的时候电压达到2.9V,3800的时候达到3.6V。最高不是3.3V吗?怎么会出现这种情况呢?
另外发现好像 没作用?求助各位大佬解答~

下面是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 ");
                        adcx=DAC_GetDataOutputValue(DAC_Channel_1);
                        printf("DAC    : %d ",adcx);
                        tmp=(float)adcx*(3.3/4096);                       
                        n=tmp;
                        tmp-=n;
                        tmp*=1000;
                        printf("DAC VAL: %d.%d ",n,(int)tmp);
                       
                        adcx=Get_Average();
                        tmp=(float)adcx*(3.3/4096);
                        n=tmp;
                        m=(tmp-n)*1000;
                        printf("ADC VAL: %d.%d ",n,m);
                        t=0;
                        LED0=!LED0;
                }
                delay_ms(100);
         }


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
edmund1234
2019-07-21 06:59
本帖最后由 edmund1234 于 2019-3-22 23:17 编辑

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

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

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

一周热门 更多>