52. STM32的DAC实验

发布者:鑫森淼焱最新更新时间:2018-10-17 来源: eefocus关键字:STM32  DAC实验 手机看文章 扫描二维码
随时随地手机看文章

一。数模转换DAC的原理

STM32的DAC的局限性:

只有大容量的STM32F103x(Flash在256K以上)的型号才有DAC功能。

1. 数模转换原理

52. <wbr>STM32的DAC实验
DAC模块有2个转换器,每个转换有一个通道。

2. STM32DAC模块的主要特点

52. <wbr>STM32的DAC实验

3. DAC模块框图

52. <wbr>STM32的DAC实验
(1)DAC1对应PA4

        DAC2对应PA5

(2)数字写在DHRx中,经过一定的时间才转到DORx寄存器中,DORx寄存器我们不能直接写。  

(3)可以通过外部触发转换。

(4)可以产生DMA请求。

52. <wbr>STM32的DAC实验

使用DAC来输出到PA4或PA5,要把PA4或PA5设置成模拟输入。

4. DAC转换

52. <wbr>STM32的DAC实验
(1)对于DAC_DHRx寄存器根据对齐方式,8位或12位数据,有6个寄存器,每个通道有3个,比如8位的左对齐,12位的左对齐,12位的右对齐,以哪种方式就要写入相应的寄存器。

(2)如果没有选择外部触发,存入寄存器DHRx的数据就会在一个APB1时钟后存入DORx寄存器。

(3)一旦数据传到DORx寄存器后,在经过时间T之后才会反应到相应的引脚。

5. DAC的数据格式

52. <wbr>STM32的DAC实验

6. 选择DAC的触发方式

可以选择外部的触发事件:

52. <wbr>STM32的DAC实验

7. DAC的输出电压的计算

DAC输出 = Vref * ( DOR / 4095)

52. <wbr>STM32的DAC实验

例: DOR中的数字是100,参考电压是3.3V,那么输出就是 3.3 * 100 / 4095

二。寄存器库函数配置

1. DAC相关的寄存器

52. <wbr>STM32的DAC实验
我们不能直接去写DOR寄存器,可以写入DHRx寄存器,经过一定事件自动转入DOR寄存器。

1. DAC控制寄存器 DAC_CR

52. <wbr>STM32的DAC实验

2. DAC的配置步骤

52. <wbr>STM32的DAC实验
52. <wbr>STM32的DAC实验
52. <wbr>STM32的DAC实验

三。实验程序讲解

1. 硬件连接

52. <wbr>STM32的DAC实验
DAC用到PA4引脚输出模拟量

在ADC实验中PA1用来测量模拟输入。

在实验中为了方便测试,可以用跳线帽把这两个引脚连在一起,我们可以通过DAC控制输出模拟量,然后在用STM32的ADC来测量模拟量。

52. <wbr>STM32的DAC实验

2. 程序讲解

(1)dac.c

//DAC通道1输出初始化

void Dac1_Init(void)

{

  

GPIO_InitTypeDef GPIO_InitStructure;

DAC_InitTypeDef DAC_InitType;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );  //使能PORTA通道时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );  //使能DAC通道时钟 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_4) ;//PA.4 输出高

DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0

DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生

DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置

DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1

                                                                                                                否则DAC不能输出到0.

    DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1

DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC1

  

    DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值

}

//设置通道1输出电压

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

void Dac1_Set_Vol(u16 vol)

{

float temp=vol;

temp/=1000;

temp=temp*4096/3.3;

DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值

}

2. 主函数main.c

int main(void)

 {  

u16 adcx;

float temp;

  u8 t=0;  

u16 dacval=0;

u8 key;

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

KEY_Init();  //初始化按键程序

  LED_Init();     //LED端口初始化

LCD_Init(); //LCD初始化

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

  Adc_Init();   //ADC初始化

Dac1_Init(); //DAC初始化

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,"2015/1/15");

LCD_ShowString(60,130,200,16,16,"WK_UP:+  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_SetChannel1Data(DAC_Align_12b_R, 0);//初始值为0          

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==KEY1_PRES)

{

if(dacval>200)dacval-=200;

else dacval=0;

 DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值

}  

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

{  

adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值

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_Channel_1,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);

}

 }

52. <wbr>STM32的DAC实验


关键字:STM32  DAC实验 引用地址:52. STM32的DAC实验

上一篇:53.PWM DAC实验
下一篇:51.内部温度传感器实验

推荐阅读最新更新时间:2024-03-16 16:16

最简单的方式 创建STM32的工程(使用标准库)-1
1:看到网上好多资料有关怎么创建STM32工程文件的,比较麻烦,都是建啥文件夹,然后拷贝文件,挪来挪去。其实在STM32标准库中本来就有工程文件的样板,如下图,有5中IDE的工程文件样板。我这里选用的标准库是F1系列的。 2:我电脑装的IDE是MDK uVision V4.00。打开上面MDK-ARM文件夹,双击直接打开Project.uvproj 工程文件。 3:直接编译-build,没问题! 这里介绍下工程目录: STM32100E-EVAL 是当前工程的名字,100E应该是一款MCU,EVAL尾缀是evalution的简写,评估的意思。 User: 里面放main.c 和 stm32f10x_it.c ,我
[单片机]
最简单的方式 创建<font color='red'>STM32</font>的工程(使用标准库)-1
STM32+74HC595:带领你10分钟用对74HC595
使用的是STM32CBT8,小模块用起来性价比超级高,资源丰富,移植u/COS及HTTP、MQTT协议等等用起来简直欲罢不能,摇摇欲仙! BUT:IO口资源太少了,我想让你驱动100个LED,你缺告诉我,我的要求太多,你满足不了...... 还好,找到了74HC595,但是网上很多资源讲的我看了半天才总结、提炼并另辟蹊径出来精髓 ========================================================== 595具体使用的步骤: 第1步:目的:将要准备输入的位数据移入74HC595数据输入端上。 方法:送位数据到_595。 第2步:目的:将位数据逐位移入74HC595,即数据串入 方法:SH
[单片机]
STM32串口波特率大小计算
波特率的计算 STM32 下的波特率和串口外设时钟息息相关,USART 1 的时钟来源于 APB2,USART 2-5 的时钟来源于 APB1。在 STM32 中,有个波特率寄存器 USART_BRR,如下: STM32 串口波特率通过 USART_BRR 进行设置,STM32 的波特率寄存器支持分数设置,以提高精确度。USART_BRR 的前 4 位用于表示小数,后 12 位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式: 从上面的表达式,我们引入了一个新量 USARTDIV,它表示对串口的时钟源 fck 进行分频。假设我们已知道
[单片机]
解决STM32每次下载程序都需要断电
Stm32的启动模式由BOOT0和BOOT1进行配置,在下载模式下我们需要讲BOOT0配置成0电平,但往往忽略了BOOT1。 一般开发板厂家都会把BOOT0和BOOT0都做成可配置的。 问题就是在下载程序的时候只在BOOT0上接了跳线帽讲其接地,但是BOOT1确由其悬空着,因此每次下载都必须重新上电才能被下载器认可,后来将BOOT1用跳线帽接到高电平后,问题成功解决,每次下载前只需要按下复位按键就可以了。
[单片机]
解决<font color='red'>STM32</font>每次下载程序都需要断电
使用 STM32 缓存来优化性能与功率效率
本应用笔记描述了意法半导体开发的首款指令缓存(ICACHE)和数据缓存(DCACHE)。 在 Arm Cortex-M33 处理器的 AHB 总线中引入的 ICACHE 和 DCACHE 嵌入到下表中列出的 STM32 微控制器(MCU)中。 这些缓存使用户从内部和外部存储器提取指令和数据时或在用于外部存储器的数据流量时提高应用性能并降低功耗。本文档提供了典型示例,以强调 ICACHE 和 DCACHE 功能,并便于配置 1.ICACHE 和 DCACHE 概述 本节概述了嵌入在基于 STM32 Arm Cortex内核的微控制器中的 ICACHE 和 DCACHE 接口。详细介绍了 ICACHE 和
[单片机]
使用 <font color='red'>STM32</font> 缓存来优化性能与功率效率
基于STM32智能家居系统的设计与实现
智能家居(又称智能住宅)是以住宅为平台,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的安全、高效、舒适、便利、环保的居住环境。利用综合布线技术、网络通信技术、智能家居一系统设计方案安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统。对比普通家居系统,智能家居不仅满足了人们对居住环境的基本要求,提供舒适安全且宜人的家庭生活空间。还能够主动提供全方位的信息服务,联合外部资源,做出智能化响应。但这类系统通常代价昂贵,控制方式单一,且易受到干扰。因此,在设计实现智能控制的同时,研制一个成本低、实用性强并能普及寻常百姓家的智能家居系统成为必然趋势。 本设
[单片机]
基于<font color='red'>STM32</font>智能家居系统的设计与实现
stm32 dac 配置过程
DAC模块的通道1来输出模拟电压,其详细设置步骤如下: 1)开启PA口时钟,设置PA4为模拟输入。 STM32F103ZET6的DAC通道1是接在PA4上的,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入(虽然是输入,但是STM32内部会连接在DAC模拟输出上)。 2)使能DAC1时钟。 同其他外设一样,要想使用,必须先开启相应的时钟。STM32的DAC模块时钟是由APB1提供的,所以我们先要在APB1ENR寄存器里面设置DAC模块的时钟使能。 3)设置DAC的工作模式。 该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。 4)设置DAC的
[单片机]
STM32之DRV8834电机驱动(PWM方式)
一、简介 本文介绍如何使用STM32通过DRV8834控制步进电机,使用PWM方式控制转动。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 1)《STM32之DRV8834电机驱动(IO方式)》:http://blog.csdn.net/feilusia/article/details/52853951 2、在进行本文步骤前,请先实现以下博文: 1)《STM32之系统滴答定时器》:
[单片机]
<font color='red'>STM32</font>之DRV8834电机驱动(PWM方式)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved