STM32F103使用DAC功能输出正弦波

发布者:创新驿站最新更新时间:2022-01-29 来源: eefocus关键字:STM32F103  输出正弦波 手机看文章 扫描二维码
随时随地手机看文章

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


DAC 主要特征


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

8位或者12位单调输出

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

同步更新功能

噪声波形生成

三角波形生成

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

每个通道都有DMA功能

外部触发转换

输入参考电压V REF+


但是这里面只有三角波和噪声波,那么正弦波要如何生成呢?


虽然DAC没有自带正弦波的功能,但是我们可以先生成一个符合正弦规律的数组,然后通过定时器,将正弦数组中的值依次发送出去,这样输出的电压值也就会成正弦规律变化了。


下面直接通过代码来演示如何输出正弦波


#include "dac_sin.h"


#define DAC_DHR12RD_Address      0x40007420



uc16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,

                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,

                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647

                     };


u32 DualSine12bit[32];

u8 Idx = 0;


//用DMA在PA4、PA5上产生正弦波

void DAC_SIN_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    DAC_InitTypeDef  DAC_InitStructure;

    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

    DMA_InitTypeDef  DMA_InitStructure;

    //时钟设置

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

    //GPIO设置

    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_TimeBaseStructure.TIM_Period = 0x19;

    TIM_TimeBaseStructure.TIM_Prescaler = 0x00;

    TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x00;

    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);


    TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);

    //DAC设置

    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T8_TRGO; //TIM8触发

    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

    DAC_Init(DAC_Channel_1, &DAC_InitStructure);


    DAC_Init(DAC_Channel_2, &DAC_InitStructure);


    for(Idx = 0; Idx < 32; Idx++)

    {

        DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);

    }

    //DMA设置

    DMA_DeInit(DMA2_Channel4);


    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address; //DMA外设基地址

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&DualSine12bit; //DMA内存基地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从存储器读

    DMA_InitStructure.DMA_BufferSize = 32; //DMA通道的DMA缓存的大小

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //数据宽度为32位

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作模式为循环模式

    DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x 非存储器到存储器模式

    DMA_Init(DMA2_Channel4, &DMA_InitStructure);


    DMA_Cmd(DMA2_Channel4, ENABLE); //使能DMA2通道4


    DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1

    DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC通道2


    DAC_DMACmd(DAC_Channel_2, ENABLE); //使能DAC的DMA功能


    TIM_Cmd(TIM8, ENABLE); //使能定时器

}


Sine12bit数组中存放的数据就是按照正弦规律变化了,可以将数组中的数据复制到表格中,观察一下。

image.png

可以看出数组中的数据组成了一个标准的正弦波。


数据有了之后开始初始化DAC,这里DAC依然使用定时器触发,使用定时8触发,波形的产生方式设置为无,因为这里不使用内部的波形发生器。


接下来数据的传输选择使用DMA模式,当然也可是通过程序设置一个循环来依次将数据中的值放到DAC寄存器中去,但是这样比较占用单片机的资源,为了节省资源,可以让单片机自己来实现这个功能。

image.png

将DMA的外设地址设置为DAC寄存器的地址,将DMA的内存地址设置为存储正弦波数据的数组,这样每次定时器8的中断发生之后,DMA就会自动从数组中拿出一个数据设置到DAC的寄存器中。通过DMA功能就可以实现数组中的数据依次被放到DAC的数据保持寄存器中。


最后使能定时器,DAC,DMA功能后,DAC的两个输出端口PA4和PA5就会自动输出成正弦规律变化的波形了。

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

上一篇:STM32F103DMA功能实现
下一篇:STM32F103使用DAC功能输出三角波

推荐阅读最新更新时间:2024-11-12 22:18

STM32F103系列微控制器在应用编程技术研究
引言 STM32F103系列芯片下载程序主要通过JTAG以及ISP(In-System Programming)这两种方式。其中JTAG需要专门的下载器,这种方式主要用于软件调试。 ISP是在系统编程,指的是利用STM32F103中自带的Bootloader程序,通过通信接口擦除和下载用户代码。STM32F103系列芯片中引脚BOO T0和BOOT1置位为1和0时就会进入ISP模式,但下载程序完成后需要将BOOT0和BOOT1都置为0,才能进入正常工作模式。这就使得在下载程序完成后需要设置跳线帽等机械性的操作。而一个嵌入式产品的设计不得不考虑软件部分的更新,前面介绍的两种下载方式都不适合用来做软件更新,也就不适合用在嵌入式
[单片机]
<font color='red'>STM32F103</font>系列微控制器在应用编程技术研究
STM32F103官方初始化模板
#include stm32f10x_lib.h 系统时钟初始化函数========================================================================================== void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并
[单片机]
STM32F103超极精简的OS
具有学习和参考价值。由图可见,任务之间有序进行,并且符合延时顺序,3个任务如“同时”运行一样,我们称之为“并发运行”。这样的好处是一个单片机实现了“多个单片机同时运行”的效果。大家都知道,裸机中要想“并发运行”,只能依靠各种中断打断main函数运行,这将耗费中断资源,而在OS加持下,整个系统只占用SysTick一个外设资源,其他资源可以任意使用,这将有利于资源的高效利用和方便代码的书写安排。 任务函数 任务运行情况
[单片机]
<font color='red'>STM32F103</font>超极精简的OS
STM32f103C8T6 bootloader设计
使用的是STM32f103C8T6:64Kflash,在应用程序中通过CAN把接受到的bin写到外置 flash的指定地址处。在bootloader中判断一个单独的标志位看程序是否需要升级,如果需要升级,则复制外置flash处的内容到STM32的内置flash的指定地址处。 如: bootloader地址:0x08000000UL 大小:10K——0x2800——STM32的内置flash 应用程序地址:0x08002800UL 大小:45K——0xB400——STM32的内置flash 升级信息表:0x720000UL 大小:8K——0x2000——外置flash 升级的bin文件地址:0x080124
[单片机]
STM32F103 CAN总线配置总结
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStruct
[单片机]
STM32F103和STM32F105在串口初始化的区别
问题描述:使用STM32F105RB芯片进行串口编程,宏定义为STM32F10X_HD,串口正常,能够收发数据,如果宏定义为STM32F10X_CL,则发送数据混乱,跟波特率不一致的现象很相似。STM32F105为互联型产品,应该进行STM32F10X_CL的宏定义。后续解决后会发上来。 解决方案: 1、原因,由于在谁stm32f10x.h中有这样一段话 #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)25000000) /*! Value of the External oscillator in Hz */
[单片机]
STM32F103x8B PB3、PB4、PA14、PA15引脚作为普通IO口使用
STM32的PB3、PB4、PA14、PA15引脚可以在使用ISP烧录的情况下释放出来,作为普通IO口使用。 初始化代码如下: void Gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); GPIO_InitStructure.GPIO_P
[单片机]
STM32F103ZET6 时钟(2)—— 代码篇
基于特定的开发板上的时钟策略: 倍频/分频系数需要在使能 PLL 之前进行配置,所以需要在 Open PLL 之前将所有系统的时钟分频器系数以及PLL的倍频系数配置好。整个时钟的配置流程如下所示: (1) 开启HSE,等待HSE稳定 (2) 设置APB2、APB1、AHB分频系数 (3) 设置PLL的时钟来源和PLL的倍频系数 (4) 开启PLL,等待PLL稳定 (5) 设置SYSCLK源为 PLL 的输出,读取时钟切换状态,确保PLLCLK被选为系统时钟 (1) OSC_IN/OSC_OUT 上外接 8M 晶振。要使用外接晶振,上电后(默认使用 8M 的HSI),首先需要使能 HSE,位于RCC_CR寄存器的 bi
[单片机]

推荐帖子

谁能告诉我我的这个源程序错在哪,怎么改,谢谢各位大神
本帖最后由紫瑶穹天于2014-5-2021:36编辑 在quartusⅡ里,这个程序怎么错了,麻烦告之怎么修改,感激不尽!modulekz(clk1,s1,s2,s8,hour,minute,second);inputclk1,s1,s2,s8;outputhour,minute,second;reghour,minute,second;always@(posedgeclk1)beginif(s1&&s2&&s8)beg
紫瑶穹天 EE_FPGA学习乐园
新唐功放
NPCA110P如何使用新唐功放
卢小宇 TI技术论坛
STM32F103T8U6是否能使用CAN?
STM32F103T8U6由于是36PIN,而参考手册上说Remapnotavailableon36-pinpackage,即不可映射到PB8,PB9或PD0,PD1,但PA11,PA12是缺省值;数据手册上看STM32F103T8U6有一个CAN,STM32CubeMAX缺省定义也是有CAN,而且定义没有错误;但是发送数据没有波形。STM32F103T8U6是否能使用CAN?用pack里面自带的例程测试一下看看可以使用CAN,先把基本框架搭建好,然后在做CAN测试。你可
jack4103 stm32/stm8
最后4天免费申请:米尔基于NXP高速率、高性能 LS1028A开发板
申请流程1.仔细阅读页面下方的产品介绍和资料,了解开发板;2.点此填写申请表单,填写测评计划和理由,即有机会参与有奖测评。板卡介绍MYD-J1028N-8E2D-I工业级,价值1998元(共2套)MYC-J1028X核心板及开发板采用NXPLS1028A系列处理器,具有丰富的高速接口和支持高清显示的特点,适用于工业路由器、工业控制、边缘计算、汽车电子、工业物联网等对高速总线接口、处理性能以及显示要求较高的场景。-基于NXPLS1028A处理
EEWORLD社区 NXP MCU
CC2530+CC2591TI官方参考设计
CC2530+CC2591TI官方参考设计CC2530+CC2591TI官方参考设计挖坟下请问下楼主,文件是什么软件画的z45217发表于2015-9-2412:05挖坟下请问下楼主,文件是什么软件画的 Cadstar吧,不过可以用AD打开的,网上有很多资料这个是电路原理图和Pcb?
1185054154 微控制器 MCU
AD 3D元件封装库
AD3D元件封装库网盘下载地址:AD3D元件封装库谢谢分享下载看看{:1_103:}这个非常不错,感谢分享看一下!你好,想学习学习谢谢分享希望有用下载不了非常不错的封装图这个非常不错,感谢分享谢谢分享.LAILO123456789学习学习这个非常不错,感谢分享dddddddddddddd谢谢:pleased::pleased::pleased::pleased::pleased::pleased::pleased::pleased::
mcufz PCB设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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