OpenEdv-开源电子网

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

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第二十四章 DAC实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-12 20:56:07 | 显示全部楼层 |阅读模式

第二十四章 DAC实验

上两章,我们介绍了STM32ADC使用,本章我们将向大家介绍STM32DAC功能。在本章中,我们将利用按键(或USMART)控制STM32内部DAC模块的通道1来输出电压,通过ADC1的通道1采集DAC的输出电压,在LCD模块上面显示ADC获取到的电压值以及DAC的设定输出电压值等信息。本章将分为如下几个部分:

24.1 STM32 DAC简介

24.2 硬件设计

24.3 软件设计

24.4 下载验证

24.1 STM32 DAC简介

大容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于大容量产品,所以是带有DAC模块的。

STM32DAC模块(数字/模拟转换模块)12位数字输入,电压输出型的DACDAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。

STM32DAC模块主要特点有:

2DAC转换器:每个转换器对应1个输出通道

8位或者12位单调输出

12位模式下数据左对齐或者右对齐

同步更新功能

噪声波形生成

三角波形生成

DAC通道同时或者分别转换

每个通道都有DMA功能

单个DAC通道的框图如图24.1.1所示:


24.1.1 DAC通道模块框图

图中VDDAVSSADAC模块模拟部分的供电,而Vref+则是DAC模块的参考电压。DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)。

从图24.1.1可以看出,DAC输出是受DORx寄存器直接控制的,但是我们不能直接往DORx寄存器写入数据,而是通过DHRx间接的传给DORx寄存器,实现对DAC输出的控制。前面我们提到,STM32DAC支持8/12位模式,8位模式的时候是固定的右对齐的,而12位模式又可以设置左对齐/右对齐。单DAC通道x,总共有3种情况:

     8位数据右对齐:用户将数据写入DAC_DHR8Rx[7:0]位(实际是存入DHRx[11:4]位)。

     12位数据左对齐:用户将数据写入DAC_DHR12Lx[15:4]位(实际是存入DHRx[11:0]位)。

     12位数据右对齐:用户将数据写入DAC_DHR12Rx[11:0]位(实际是存入DHRx[11:0]位)。

我们本章使用的就是单DAC通道1,采用12位右对齐格式,所以采用第③种情况。

如果没有选中硬件触发(寄存器DAC_CR1TENx位置’0),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。如果选中硬件触发(寄存器DAC_CR1TENx位置’1),数据传输在触发发生以后3APB1时钟周期后完成。 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间

之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。我们可以从STM32F103ZET6的数据手册查到的典型值为3us,最大是4us。所以DAC的转换速度最快是250K左右。

本章我们将不使用硬件触发(TEN=0),其转换的时间框图如图24.1.2所示:


24.1.2 TEN=0DAC模块转换时间框图

DAC的参考电压为Vref+的时候,DAC的输出电压是线性的从0~Vref+12位模式下DAC输出电压与Vref+以及DORx的计算公式如下:

DACx输出电压=Vref*DORx/4095

接下来,我们介绍一下要实现DAC的通道1输出,需要用到的一些寄存器。首先是DAC控制寄存器DAC_CR,该寄存器的各位描述如图24.1.3所示:


24.1.3 寄存器DAC_CR各位描述

       DAC_CR的低16位用于控制通道1,而高16位用于控制通道2,我们这里仅列出比较重要的最低8位的详细描述,如图24.1.4所示:

24.1.4 寄存器DAC_CR低八位详细描述

       首先,我们来看DAC通道1使能位(EN1),该位用来控制DAC通道1使能的,本章我们就是用的DAC通道1,所以该位设置为1

       再看关闭DAC通道1输出缓存控制位(BOFF1),这里STM32DAC输出缓存做的有些不好,如果使能的话,虽然输出能力强一点,但是输出没法到0,这是个很严重的问题。所以本章我们不使用输出缓存。即设置该位为1

       DAC通道1触发使能位(TEN1),该位用来控制是否使用触发,里我们不使用触发,所以设置该位为0

       DAC通道1触发选择位(TSEL1[2:0]),这里我们没用到外部触发,所以设置这几个位为0就行了。

       DAC通道1噪声/三角波生成使能位(WAVE1[1:0]),这里我们同样没用到波形发生器,故也设置为0即可。

       DAC通道1屏蔽/复制选择器(MAMP[3:0]),这些位仅在使用了波形发生器的时候有用,本章没有用到波形发生器,故设置为0就可以了。

       最后是DAC通道1 DMA使能位(DMAEN1),本章我们没有用到DMA功能,故还是设置为0

       通道2的情况和通道1一模一样,这里就不不细说了。在DAC_CR设置好之后,DAC就可以正常工作了,我们仅需要再设置DAC的数据保持寄存器的值,就可以在DAC输出通道得到你想要的电压了(对应IO口设置为模拟输入)。本章,我们用的是DAC通道112位右对齐数据保持寄存器:DAC_DHR12R1,该寄存器各位描述如图24.1.5所示:


24.1.5 寄存器DAC_DHR12R1各位描述

       该寄存器用来设置DAC输出,通过写入12位数据到该寄存器,就可以在DAC输出通道1PA4)得到我们所要的结果。

       通过以上介绍,我们了解了STM32实现DAC输出的相关设置,本章我们将使用DAC模块的通道1来输出模拟电压,其详细设置步骤如下:

1)开启PA口时钟,设置PA4为模拟输入。

STM32F103ZET6DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入(虽然是输入,但是STM32内部会连接在DAC模拟输出上)。

2)使能DAC1时钟。

同其他外设一样,要想使用,必须先开启相应的时钟。STM32DAC模块时钟是由APB1提供的,所以我们先要在APB1ENR寄存器里面设置DAC模块的时钟使能。

3)设置DAC的工作模式。

该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。  

4)设置DAC的输出值。

通过前面3个步骤的设置,DAC就可以开始工作了,我们使用12位右对齐数据格式,所以我们通过设置DHR12R1,就可以在DAC输出引脚(PA4)得到不同的电压值了。

最后,再提醒一下大家,本例程,我们使用的是3.3V的参考电压,即Vref+连接VDDA

通过以上几个步骤的设置,我们就能正常的使用STM32DAC通道1来输出不同的模拟电压了。

24.2 硬件设计

本章用到的硬件资源有:

1)  指示灯DS0

2)  WK_UPKEY1按键

3)  串口

4)  TFTLCD模块

5)  ADC

6)  DAC

本章,我们使用DAC通道1输出模拟电压,然后通过ADC1的通道1对该输出电压进行读取,并显示在LCD模块上面,DAC的输出电压,我们通过按键(或USMART)进行设置。

我们需要用到ADC采集DAC的输出电压,所以需要在硬件上把他们短接起来。ADCDAC的连接原理图如图24.2.1所示:


24.2.1 ADCDACSTM32连接原理图

       P14是多功能端口,我们只需要通过跳线帽短接P14ADCDAC,就可以开始做本章实验了。如图24.2.2所示:


24.2.2 硬件连接示意图

 

24.3 软件设计

找到上一章的工程,首先在HARDWARE文件夹下新建一个DAC的文件夹。然后打开USER文件夹下的工程,新建一个dac.c的文件和dac.h的头文件,保存在DAC文件夹下,并将DAC文件夹加入头文件包含路径。

打开dac.c,输入如下代码:

#include "dac.h"

//DAC通道1输出初始化

void Dac1_Init(void)

{

       RCC->APB2ENR|=1<<2;    //使能PORTA时钟          

       RCC->APB1ENR|=1<<29;   //使能DAC时钟         

       GPIOA->CRL&=0XFFF0FFFF;

       GPIOA->CRL|=0X00000000;//PA4 模拟输入     

       DAC->CR|=1<<0;  //使能DAC1

       DAC->CR|=1<<1;  //DAC1输出缓存不使能 BOFF1=1

       DAC->CR|=0<<2;  //不使用触发功能 TEN1=0

       DAC->CR|=0<<3;  //DAC TIM6 TRGO,不过要TEN1=1才行

       DAC->CR|=0<<6;  //不使用波形发生

       DAC->CR|=0<<8;  //屏蔽、幅值设置

       DAC->CR|=0<<12;       //DAC1 DMA不使能   

       DAC->DHR12R1=0;

}

//设置通道1输出电压

//vol:0~3300,代表0~3.3V

void Dac1_Set_Vol(u16 vol)

{

       float temp=vol;

       temp/=1000;

       temp=temp*4096/3.3;

       DAC->DHR12R1=temp;

}

此部分代码就2个函数,Dac1_Init函数用于初始化DAC通道1。这里基本上是按我们上面的步骤来初始化的,经过这个初始化之后,我们就可以正常使用DAC通道1了。第二个函数Dac1_Set_Vol,用于设置DAC通道1的输出电压,通过USMART调用该函数,就可以随意设置DAC通道1的输出电压了。

保存dac.c代码,并将该代码加入HARDWARE组下。接下来在dac.h文件里面输入如下代码:

#ifndef __DAC_H

#define __DAC_H 

#include "sys.h"        

void Dac1_Init(void);           //DAC通道1初始化          

void Dac1_Set_Vol(u16 vol); //设置通道1输出电压

#endif

该部分代码很简单,这里我们就不多说了。接下来我们在test.c里面,修改main函数如下:

int main(void)

{    

       u16 adcx;

       float temp;

      u8 t=0;   

       u16 dacval=0;

       u8 key;

      Stm32_Clock_Init(9);    //系统时钟设置

       uart_init(72,9600);      //串口初始化为9600

       delay_init(72);                  //延时初始化

       LED_Init();                 //初始化与LED连接的硬件接口

      LCD_Init();                  //初始化LCD

       usmart_dev.init(72);      //初始化USMART       

       KEY_Init();                  //按键初始化             

      Adc_Init();                   //ADC初始化

       Dac1_Init();                //DAC通道1初始化      

       POINT_COLOR=RED;//设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"DAC TEST");    

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/8");      

       LCD_ShowString(60,130,200,16,16,"WKUP:+  KEY1:-");    

       //显示提示信息                                                                                

       POINT_COLOR=BLUE;//设置字体为蓝色

       LCD_ShowString(60,150,200,16,16,"DAC VAL:");         

       LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");             

       LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");          

       DAC->DHR12R1=dacval;//初始值为0                        

       while(1)

       {

              t++;

              key=KEY_Scan(0);                      

              if(key==4)

              {           

                     if(dacval<4000)dacval+=200;

                     DAC->DHR12R1=dacval;            //输出    

              }else if(key==2)    

              {

                     if(dacval>200)dacval-=200;

                     else dacval=0;

                     DAC->DHR12R1=dacval;           //输出

              }    

              if(t==10||key==2||key==4)           //WKUP/KEY1按下了,或者定时时间到了

              {      

                    adcx=DAC->DHR12R1;

                     LCD_ShowxNum(124,150,adcx,4,16,0);                 //显示DAC寄存器值

                     temp=(float)adcx*(3.3/4096);                                   //得到DAC电压值

                     adcx=temp;

                    LCD_ShowxNum(124,170,temp,1,16,0);                 //显示电压值整数部分

                    temp-=adcx;

                     temp*=1000;

                     LCD_ShowxNum(140,170,temp,3,16,0X80);     //显示电压值的小数部分

                    adcx=Get_Adc_Average(ADC_CH1,10);            //得到ADC转换值        

                     temp=(float)adcx*(3.3/4096);                                   //得到ADC电压值

                     adcx=temp;

                    LCD_ShowxNum(124,190,temp,1,16,0);        //显示电压值整数部分

                    temp-=adcx;

                     temp*=1000;

                     LCD_ShowxNum(140,190,temp,3,16,0X80);     //显示电压值的小数部分

                     LED0=!LED0;         

                     t=0;

              }        

              delay_ms(10);

 

       }

}

此部分代码,我们先对需要用到的模块进行初始化,然后显示一些提示信息,本章我们通过WK_UPKEY1(也就是上下键)来实现对DAC输出的幅值控制。按下WK_UP增加,按KEY1减小。同时在LCD上面显示DHR12R1寄存器的值、DAC设计输出电压以及ADC采集到的DAC输出电压。

本章,我们还可以利用USMART来设置DAC的输出电压值,故需要将Dac1_Set_Vol函数加入USMART控制,方法前面已经有详细的介绍了,大家这里自行添加,或者直接查看我们光盘的源码。

main函数代码可以看出,按键设置输出电压的时候,每次都是以0.161V递增或递减的,而通过USMART调用Dac1_Set_Vol函数,则可以实现任意电平输出控制(当然得在DAC可控范围内)。

24.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图24.4.1所示:

24.4.1 DAC实验测试图

同时伴随DS0的不停闪烁,提示程序在运行。此时,我们通过按WK_UP按键,可以看到输出电压增大,按KEY1则变小。

大家可以试试在USMART调用Dac1_Set_Vol函数,来设置DAC通道1的输出电压,如图24.4.2所示:



24.4.2 通过usmart设置DAC通道1的电压输出

 

 

实验19 DAC实验.rar

109.97 KB, 下载次数: 2078

《STM32开发指南》第二十四章 DAC实验.pdf

858.57 KB, 下载次数: 1817

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

winke 该用户已被删除
发表于 2015-7-8 17:59:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 1 反对 0

使用道具 举报

7

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2011-9-3
在线时间
4 小时
发表于 2013-3-12 21:31:14 | 显示全部楼层
沙发,之前一直只搞定一路,看看原子是如何设定的。
http://shop60782849.taobao.com/显示屏专卖
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-6-30
在线时间
0 小时
发表于 2013-6-30 19:28:54 | 显示全部楼层
太感动了,终于找到了!!!
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-8-5
在线时间
31 小时
发表于 2013-8-5 22:37:06 | 显示全部楼层
原子哥,我的偶像呀
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-2-24
在线时间
0 小时
发表于 2014-2-24 08:59:54 | 显示全部楼层
想问问原子大神有没有TIM+DMA+DAC的例程?  最近做了一个 运行时只是在开机时有一个周期的波形产生,后续就没有波形了,不知如何是好啊,烦原子大哥指教。  万分感谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-2-24 13:50:27 | 显示全部楼层
没有现成的例程
你这个一步步来吧,
先DAC
再DMA+DAC
再TIM+DMA+DAC
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2014-3-25 14:07:41 | 显示全部楼层
请问原子哥,我把缓冲Enable的话,输出最小是200mV,这个好像是正常的。。。我把DAC的输出缓冲关闭了,输出最小是2.42V,到不了0。。。估计是哪儿配置出了问题??谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-3-25 15:14:19 | 显示全部楼层
回复【7楼】seupenn:
---------------------------------
1,万用表是否有问题?
2,DAC参考电压是否正常?
3,代码设置是否OK?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2014-3-25 16:32:53 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
1.我用示波器看的。
2.参考电压应该不会有问题吧,我用按键控制DAC输出加减,最大可以到3.2几V。
3.代码就是用的您战舰DAC示例的代码。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-3-25 21:03:02 | 显示全部楼层
回复【9楼】seupenn:
---------------------------------
我们例程是开启缓冲的,至于不开缓冲为什么会这样,难道是驱动能力弱???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2014-3-26 10:14:14 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
 DAC->CR|=1<<1;  //DAC1输出缓存不使能 BOFF1=1


这个不是关闭缓冲么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-3-27 00:38:33 | 显示全部楼层
回复【11楼】seupenn:
---------------------------------
额,我搞错了,我们的是关闭的,呵呵。
不好意思啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-12-4
在线时间
2 小时
发表于 2015-3-26 20:56:51 | 显示全部楼层

void Dac1_Set_Vol(u16 vol)

{

       float temp=vol;

       temp/=1000;

       temp=temp*4096/3.3;

       DAC->DHR12R1=temp;

}我想问一下,就是,如果说输入的vol=100,那temp/=1000;那temp的值不应该是0么???

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-3-26 22:31:47 | 显示全部楼层
回复【13楼】三斤的裤衩:
---------------------------------
此问题请自行仿真验证.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-7-8 23:07:44 | 显示全部楼层
回复【15楼】winke:
---------------------------------
我也没同时用过,你先研究下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

winke 该用户已被删除
发表于 2015-7-10 10:30:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-7-22 19:05:53 | 显示全部楼层
有没有办法把这些例程、 DF打包带走啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-7-22 22:05:33 | 显示全部楼层
回复【18楼】松子:
---------------------------------
一个个下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-7-23 12:37:31 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
好吧
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-6-16
在线时间
0 小时
发表于 2015-7-30 16:55:57 | 显示全部楼层
原子哥,如果输出提高到第四位小数,怎么弄?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-7-30 20:07:23 | 显示全部楼层
回复【21楼】浩哥:
---------------------------------
丢弃四位以后的小数即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-6-16
在线时间
0 小时
发表于 2015-7-31 09:48:49 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
回复【22楼】正点原子:
---------------------------------
@原子哥,可能我没表达清楚,就是DAC实验例程里,输出的是们0.000V,而我需要输出精度到0.0004V,也就是0.4mv,修改显示位数0.0000V,但是第四位好像是虚的,一直为零,依据输出,模拟电压=VOL*3.3/4096,如果VOL为2,则模拟电压=2*3.3/4096=0.00161V,可是显示不了0.0016V,请原子哥给个思路。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-7-31 11:13:12 | 显示全部楼层
回复【23楼】浩哥:
---------------------------------
STM32的dac是12位的,分辨率最高就是:3.3/4096=0.0008V,你要0.0004的精度,不是强人所难么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-8-5
在线时间
0 小时
发表于 2015-8-5 22:37:59 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
temp=temp*4096/3.3;

我咋觉得应该是4095呢, 有没有人和我一样的疑问?
Dac1_Set_Vol(3300)输出应该是3.3V而不是0V
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-11-23
在线时间
0 小时
发表于 2015-11-23 21:54:44 | 显示全部楼层
原子哥
    F1的板子,信号发生器接ADC采样,再在定时器里将ADC采样值赋给DAC( Dac1_Set_Vol(Get_Adc(u8 ch)) ),用示波器看DAC输出。
    波形是被割掉了波峰的正弦波,如图:


    ADC和DAC都是12位的,对齐方式也都是右对齐。
    代码是在例程的基础上修改的。
    会是什么问题呢?
曾经日天
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2015-11-23 22:18:30 | 显示全部楼层
回复【26楼】日天学32:
---------------------------------
你要查下ADC数据.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-11-24
在线时间
1 小时
发表于 2016-11-24 11:31:19 | 显示全部楼层
winke 发表于 2015-7-8 17:59
**** 作者被禁止或删除 内容自动屏蔽 ****

请问你现在解决了? 是硬件问题?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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