STM32F103使用DAC功能输出三角波

发布者:pcwg最新更新时间:2022-02-02 来源: eefocus关键字:STM32F103 手机看文章 扫描二维码
随时随地手机看文章

在DAC的主要特征中可以看出,DAC内部还带有波形发生器。


DAC 主要特征


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

8位或者12位单调输出

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

同步更新功能

噪声波形生成

三角波形生成

双DAC通道同时或者分别转换

每个通道都有DMA功能

外部触发转换

输入参考电压V REF+


比如我们要输出一个三角波,就不需要自己去计算三角波每个点的电压是多少,通过内部自带的三角波发生器,就可以产生三角波。具体的操作步骤在官方文档中也有介绍。


三角波生成


可以在DC或者缓慢变化的信号上加上一个小幅度的三角波。设置WAVEx[1:0]位为’10’选择DAC的三角波生成功能。设置DAC_CR寄存器的MAMPx[3:0]位来选择三角波的幅度。内部的三角波计数器每次触发事件之后3个APB1时钟周期后累加1。计数器的值与DAC_DHRx寄存器的数值相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx寄存器的数值小于MAMP[3:0]位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递减,达到0后再开始累加,周而复始。将WAVEx[1:0]位置’0’可以复位三角波的生成。

image.png
image.png

注意:


为了产生三角波,必须使能 DAC 触发,即设 DAC_CR 寄存器的 TENx 位为 ’1’ 。

MAMP[3:0] 位必须在使能 DAC 之前设置,否则其值不能修改

下面通过代码来设置DAC输出三角波


#include "dac_wave.h"


//通过DAC通道1和通道2输出三角波

void DAC_Wave_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    DAC_InitTypeDef            DAC_InitStructure;

    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

    TIM_TimeBaseStructure.TIM_Period = 0x0F;

    TIM_TimeBaseStructure.TIM_Prescaler = 0x01;

    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);


    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;

    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;

    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;

    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

    DAC_Init(DAC_Channel_1, &DAC_InitStructure);


    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;

    DAC_Init(DAC_Channel_2, &DAC_InitStructure);


    DAC_Cmd(DAC_Channel_1, ENABLE);

    DAC_Cmd(DAC_Channel_2, ENABLE);


    DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);


    TIM_Cmd(TIM2, ENABLE);

}

将DAC的通道1和通道2都开启,要自动输出三角波,这时候就不能使用软件自己去触发了,在这里要借助定时器来自动触发,当定时器定时时间到了之后,就会触发一次DAC的输出,这里使用的是定时器2触发,所以初始化DAC的时候。也要初始化定时器2,接下里初始化DAC,设置DAC的触发方式为定时器2触发,然后选择三角波发生器,接下来设置通道1三角波的幅度最大值为4095。也就是输出的三角波最大电压值为3.3V。设置通道2的三角波最大幅值为2047,也就是通道2的最大值为通道1的一半1.65V。最后使能DAC输出。这是三角波就会的PA4和PA5引脚上自动输出了。通过示波器就能看到这两个引脚上的波形了。


关键字:STM32F103 引用地址:STM32F103使用DAC功能输出三角波

上一篇:STM32F103使用DAC功能输出正弦波
下一篇:STM32F103DAC功能实现

推荐阅读最新更新时间:2024-11-09 19:41

如何将LCD与STM32F103C8T6 STM32开发板连接并编程
对于任何微控制器项目,将显示单元与它连接将使项目更容易,并吸引用户与之交互。微控制器最常用的显示单元是 16×2 字母数字显示器。这些类型的显示器不仅可用于向用户显示重要信息,还可以在项目的初始开发阶段充当调试工具。因此,在本教程中,我们将学习如何将16×2 LCD显示器与STM32F103C8T6STM32开发板连接,并使用Arduino IDE对其进行编程。 所需材料 STM32蓝丸开发板 16×2 液晶显示屏 FTDI 程序员 连接线 液晶显示器 16×2 点阵 LCD 显示屏简介 如前所述,Energia IDE提供了一个漂亮的库,使接口变得轻而易举,因此不一定要了解显示模块的任何信息。但是,展示我们正在使用的东西不是
[单片机]
如何将LCD与<font color='red'>STM32F103</font>C8T6 STM32开发板连接并编程
STM32F103ZET6 — TIM6/TIM7
介绍 STM32F103ZET6 定时器资源非常丰富,根据 datasheet 描述,涵盖如下几种类型: 高级定时器 TIM1 / TIM8 通用定时器 TIM2 / TIM3 / TIM4 / TIM5 基本定时器 TIM6/ TIM7 本次描述的重点是基本定时器 TIM6/ TIM7 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。 时钟 可以看到来自 APB1 的低频时钟经过频率x2
[单片机]
<font color='red'>STM32F103</font>ZET6 — TIM6/TIM7
STM32F103与STM32F407的SPI调试笔记
在写入SPI数据数,必须调用 SPI_I2S_ReceiveData(SPI1);读取一次,不然会对数据的读取不正确 u8 SPI_Flash_GetChar(void){ u8 Data = 0; Data = SPI_I2S_ReceiveData(SPI1);//必须读取一次,应该是读后清空寄存器 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_FLAG_TXE); SPI_I2S_SendData(SPI1, 0xff); while (S
[单片机]
基于STM32F103的红外遥控小车
#include remote.h #include stm32f10x.h #include delay.h #include usart.h //ºìÍâÒ£¿Ø³õʼ»¯ //³õʼ»¯IO¿ÚÅäÖÃÒÔ¼°¶¨Ê±Æ÷5ÊäÈ벶»ñ void Remote_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef
[单片机]
STM32F103ZE开发板 LWIP网络协议栈应用之连接腾讯云
1.LWIP介绍 lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持 TCP 协议主要功能的基础上减少对RAM的占用。 LwIP是Light Weight(轻型)IP 协议,有无操作系统的支持都可以运行。LwIP 实现的重点是在保持TCP协议 主要功能的基础上减少对RAM的占用,它只需十几KB的RAM和 40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。 2.连接腾讯物联网平台 硬件平台:STM32F103ZE开发板、DM9000有线网卡、LCD屏 开发环境:KEIL5 网卡工作模式:TCP客
[单片机]
<font color='red'>STM32F103</font>ZE开发板 LWIP网络协议栈应用之连接腾讯云
STM32F103之DMA实验,内存通过DMA向串口1发送数据
#include dma.h ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// DMA_InitTypeDef DMA_InitStructure; u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度 //DMA1的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器- 外设模式
[单片机]
STM32F103标准库开发---SPI实验---底层驱动程序
一、SPI 实验----I/O端口配置 在本次 SPI 实验中,STM32芯片做主控,主要使用 SPI1 功能。 具体引脚配置如下: 具体引脚初始化程序如下: /* SPI引脚初始化配置 **PA4------CS **PA5------SCLK **PA6------MISO **PA7------MOSI */ void SPI1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );/
[单片机]
<font color='red'>STM32F103</font>标准库开发---SPI实验---底层驱动程序
STM32F103C8T 学习 - 第一个DEMO LED灯闪烁
一.需要修改的文件 使用的硬件是最小系统,LED使用的引脚与库定义的LED不相同,所有要先修改LED的定义. stm3210c_eval.h #define LED1_PIN GPIO_Pin_7 #define LED1_GPIO_PORT GPIOB #define LED1_GPIO_CLK RCC_APB2Periph_GPIOB #define LED2_PIN GPIO_Pin_12 #define LED2_GPIO_PORT GPIOB #define LED2_GPIO_CLK
[单片机]

推荐帖子

msp430的pcb板子,段码液晶不知道怎么回事显示有影响
我画了一个板子,用的是内部lcd控制器控制段码液晶显示,不知道为啥老是显示受影响,不该亮的也暗暗地显示,程序绝对没有问题,因为下载到另外一个板子上显示很好,不知道是不是pcb的哪受影响?谢谢msp430的pcb板子,段码液晶不知道怎么回事显示有影响应该硬件连接的问题,液晶屏没连接好?qwqwqw2088发表于2014-8-2508:50应该硬件连接的问题,液晶屏没连接好? 液晶链接应该没问题,是不是有信号干扰或者是一些电阻电容选择的问题信号干扰如没有大的电流负载这
godlovewinner 微控制器 MCU
单片机IO能不能直接接NPN基极,使用推挽高电平驱动三极管?
IO口直接接到NPN三极管基极(没有在接基极串接电阻)试了下,推挽输出驱动三极管工作在开关状态,电路工作不正常然后找了半天原因,想着可能是推挽电流太大,换成用IO的上拉输入去驱动三极管工作在开关状态比较合适实验现象:推挽高电平驱动10ms,然后推挽低电平10ms,NPN管子工作在开关状态,结果无论是高电平还是低电平三极管始终导通;换成上拉输入驱动三极管导通,推挽低电平使三极管工作在截止状态,一切正常。为什么会这样?单片机IO能不能直接接NPN基极,使用推挽高电平驱动三极管?“结果无
飞鸿浩劫 stm32/stm8
Python 进阶学习资源 0积分下载
Python作为一种高级、通用的解释型编程语言,以其简洁的语法和易于学习的特性,在人工智能领域得到广泛应用,包括机器学习、深度学习、自然语言处理和计算机视觉等领域。因此,在开始人工智能开发之前,建立坚实的Python基础是必不可少的。本文集收集整理了Python进阶学习资源,不乏一些经典书籍,涵盖文件操作与异常处理、堆栈与队列、迭代器与生成器、进程和线程、编程技巧和示例代码等知识。希望对大家有所帮助。资源预览:Python高级编程第2版PythonCookbook(
arui1999 下载中心专版
MSP430-IO端口介绍
MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。端口P1`P6的每一位都可以独立用于输入/输出,即具有位寻址功能。常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。由于MSP430的端口只有数据口,没有状态口或控制口,在实际
火辣西米秀 微控制器 MCU
发一个 SI4463的 WDS 配置软件
发一个SI4463的WDS配置软件(由于文件大于15M,要分3个包)发一个SI4463的WDS配置软件发一个SI4463的WDS配置软件(由于文件大于15M,要分3个包)发一个SI4463的WDS配置软件(由于文件大于15M,要分3个包)
gdgn526345 RF/无线
【MicroPython】+家用气象仪
我的家用气像仪已经开工了,以后分享的内容都在会本贴分享。全程都开源!欢迎大家来指教,纯的菜鸟,所以希望大家帮忙指正。估对这python语言是完全零了解,所以是一边看着语法书一边写的,github.com上面的分享的驱动也挺多的,不过有些怪怪的,比如MicroPython5110的驱动不是太完善,没有提供简易字库供,需要自己建字库,另外也没有提供单字符与字符串输出API,所以就需要自己来写了,昨天简单的驱动一下LCD5110,今天去github.com别的树莓派上拷了个简易字库,建了一个
strong161 MicroPython开源版块
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved