STM32-DA发送正弦波

news/2025/2/22 1:45:52/

开发平台

STM32F0 + Cubemx + MDK V5

Cubemx配置(DA + DMA + Timer)

DA的工作原理是使用定时器在固定时间内将产生正弦波的数据通过DMA的方式传送到DA控制器,从而产生固定频率的正弦波。

DA配置

DA的DMA配置

DMA的配置

Timer的配置

Timer的主时钟配置为48MHz。

prescaler的作用是将工作的主时钟进行相应配置数据的分频。

例如下图所示设置为0代表不进行分频。如设置为1(从0开始计数),则表示对48M进行2分频,则时钟为24M。

Counter Period 的作用是表示在分频时钟下继续进行相应的分频,产生触发中断。

例如下图为239表示在48M下进行240分频,则产生的时钟48MHz / 240 = 200KHz。

即在200K的频率下发送DA的数据,每次发送的大小为half word(如上图DMA配置所示)。

MDK V5代码

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include <math.h>/* Private variables ---------------------------------------------------------*/
DAC_HandleTypeDef hdac1;
DMA_HandleTypeDef hdma_dac1_ch1;TIM_HandleTypeDef htim6;/* Private variables ---------------------------------------------------------*/
#define PI 3.1415926
#define Um 1.8 /*正弦波峰峰值为1.8Vpp*/
uint16_t HZ;
#define DL 200 /*正弦波一个周期使用200个点进行描绘*//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_DAC1_Init(void);
static void MX_TIM6_Init(void);/* Private function prototypes -----------------------------------------------*/
/*正弦波一个周期使用DL个点进行描绘且幅值为1.8Vpp*/
void SineWave_Data( uint16_t cycle ,uint16_t *D)
{uint16_t i;float JD;float ZH;float HD;for( i=0;i<cycle;i++){   JD = 2*PI*i/cycle;  /*正弦波一个周期使用DL个点进行描绘*/ZH = 4096/3.23;  /*外部参考电压为3.3V,同时DA为12bits*/HD = (float)sin(JD);			  D[i]= (Um/2*HD+1)*ZH;  /*1.8Vpp的正弦波需要将sin的负半轴的数据向上平移0.9个单位*//*加1的目的是防止可能产生的信号很小部分被拉成0造成信号失真度较大*/}
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_DAC1_Init();MX_TIM6_Init();uint16_t DualSine12bit[DL];                                                      	SineWave_Data(DL ,DualSine12bit);									HAL_TIM_Base_Start(&htim6);HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t *)DualSine12bit,DL,DAC_ALIGN_12B_R);while (1){}}

调试出现的问题

数组定义为500时,不能进入主程序且直接死掉。

需要修改startup_stm32f051x8.s文件中的

Stack_Size		EQU     0x400  /*修改为0x1000*/

在1k时有时发送不出数据

主要和1周期的sin函数点数有关系,其中绘制正弦波的点数不能超过timer触发中断的点数。
例如,本实例中发送1KHz正弦波,主要是保证DMA-1毫秒内发送的数据(DMA配置图中239)要大于绘制正弦波的点数(即程序中的DL=200)。


http://www.ppmy.cn/news/483412.html

相关文章

常用AD/DA简介

目前生产AD/DA的主要厂家有ADI、TI、BB、PHILIP、MOTOROLA等&#xff0c;武汉力源公司拥有多年从事电子产品的经验和雄厚的技术力量支持&#xff0c;已取得排名世界前列的模拟IC生产厂家ADI、TI公司代理权&#xff0c;经营全系列适用各种领域/场合的AD/DA器件。 1. AD公司AD/DA…

davinci-0.3.0安装部署

davinci-0.3.0-beta.5 release安装部署 下载地址&#xff1a; https://github.com/edp963/davinci/releases/download/v0.3.0-beta.5/davinci-assembly_3.0.1-0.3.1-SNAPSHOT-dist-beta.5.zip 上传davinci zip包到系统某个目录下&#xff0c;如/export/servers&#xff0c;将其…

DA转换原理及实现

这一篇介绍D/A转换原理以及在TX-1C上的接线方式&#xff08;实现方法&#xff09;&#xff0c;再用一个例子来加深理解 D/A转换原理及参数指标 1.基本原理 数字量是二进制代码数位组合而来的&#xff0c;每位都有一定的权重&#xff0c;在D/A转换中&#xff0c;怎么样把这些…

AD/DA转换器

一、数模转换器(DAC)&#xff1a;将数字信号到模拟信号的转换。按照基本原理可以分为电流求和型和分压器型两种。 电流求和型包括&#xff1a;权电阻型DAC、权电流型DAC、倒T型电阻网络DAC。 分压器型包括&#xff1a;开关树型DAC、权电容网络DAC。 按照输入方式可以分为&am…

AD和DA转换

AD和DA转换 1.转换类别 电信号:电压、电流等 非电信号:压力、温度、湿度、位移、声音等 但在A/D转换前&#xff0c;输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。 2.转换原理 (1)比较器&#xff0c;所有的AD转换芯片内部都是用比较器来实现的。…

单片机c语言ad与da转换实验报告,单片机AD与DA转换实验报告.docx

单片机AD与DA转换实验报告.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。 2.下载的文档,不会出现我们的网址水印。 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请…

Davinci 可视化系统部署安装及简单使用

Davinci 是一个目前比较热门的国内开源BI系统&#xff0c;功能比较完善&#xff0c;各种可视化效果也挺不错。主要获取数据的方式是通过编写SQL 创建数据视图来展示各种图表的。 Davinci面向业务人员/数据工程师/数据分析师/数据科学家&#xff0c;致力于提供一站式数据可视化解…

Davinci源码部署—后端代码本地部署

Davinci源码地址&#xff1a;https://github.com/edp963/davinci 本人环境: davinci 0.3 node v10.15.3 npm 6.4.1 idea 2018.3 jdk 1.8.0_192 maven 3.6.1 mysql 5.7 ##### 目录结构 脚本├── bin # 脚本目录├── migration # 较大版本…