【STM32+HAL】DAC+DMA输出波形实现

这篇具有很好参考价值的文章主要介绍了【STM32+HAL】DAC+DMA输出波形实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、准备工作:


有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具:


1、芯片: STM32F407ZGT6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F4xxHAL库

三、实现功能:


1、DAC+DMA输出波形

2、按键切换波形及频率

3、串口打印当前波形以及频率值

四、HAL库配置 (初始配置完成):

1、开启DAC

这里开启的是通道一

Output Buffer:关闭后可输出更低的电压值

Trigger:触发方式,这里选择TIM2定时器触发

Wave generation mode:关闭后可输出自定义波形

hal dac+dma输出方波,STM32,stm32,嵌入式硬件,单片机

2、开启DMA

Mode:选择循环

Data Width:发送数据长度,半字即可

hal dac+dma输出方波,STM32,stm32,嵌入式硬件,单片机

3、配置定时器

初始化定时器触发频率为1:84MHZ / 84 / 100 =1000HZ

触发事件选择“更新触发事件”

hal dac+dma输出方波,STM32,stm32,嵌入式硬件,单片机

4、配置按键

根据你的原理图选择合适的参数

hal dac+dma输出方波,STM32,stm32,嵌入式硬件,单片机

5、配置中断优先级hal dac+dma输出方波,STM32,stm32,嵌入式硬件,单片机

 至此,CUBEMX配置完成

五、KEIL填写代码:

1、初始化DAC、DMA、TIM2

	HAL_TIM_Base_Start(&htim2);
	HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);
	HAL_DAC_Start(&hdac, DAC_CHANNEL_1);

2、按键中断改变波形频率

直流电压:0-3V,按键可调,步进0.1V

方波:Vpp=3V,频率1k-10k,步进1k

三角波:Vpp=3V,频率5k-10k,步进1k

正弦波:Vpp=3V,频率25k-50k,步进5k

MC波:自定义波形,频率200HZ,VPP=2V

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	UNUSED(GPIO_Pin);
	if(GPIO_Pin == GPIO_PIN_0){   //按键切换波形
		HAL_Delay(20);
		if(GPIO_Pin == GPIO_PIN_0){
			dac_mode=(dac_mode+1)%5;  //一共5种波形
			switch(dac_mode){
				case 0: //直流电压
				dy_10=0;
				pl_100=2;
				HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
				//HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
				HAL_Delay(3);
				HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,DAC_ALIGN_12B_R,dy);
				HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
				break;
				case 1:  //方波
				pl_100=10;
				dy_10=30;
				finds(65625/pl_100/10,&B,&C);
				HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
				HAL_Delay(3);
				HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)&Square, 128, DAC_ALIGN_12B_R);break;
				case 2:  //三角波
				pl_100=50;
				finds(65625/pl_100/10,&B,&C);
				dy_10=30;
				HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
				HAL_Delay(3);
				HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)&Triangle, 128, DAC_ALIGN_12B_R);break;
				case 3:  //正弦波
				pl_100=250;
				finds(262500/pl_100/10,&B,&C);
				dy_10=30;
				HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
				HAL_Delay(3);
				HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)&Sin, 32, DAC_ALIGN_12B_R);break;
				case 4:  //MC波
				pl_100=2;
				TIM2->ARR=100-1;
				TIM2->PSC=36-1;
				dy_10=20;
				HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
				HAL_Delay(3);
				HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)&MC, 300,     DAC_ALIGN_12B_R);
				break;
				default:break;
			}    
		}
	}

	if(GPIO_Pin == GPIO_PIN_8){  //按键切换电压
		HAL_Delay(20);
		if(GPIO_Pin == GPIO_PIN_8){
			if(dy_10 > 30) dy_10=0;
			else dy_10=dy_10+1;
		dy=dy_10*4096/33+20;
		//HAL_DAC_Stop(&hdac, DAC_CHANNEL_1);
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1,DAC_ALIGN_12B_R,dy);
		HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
		}
	}

	if(GPIO_Pin == GPIO_PIN_9){  //按键切换频率
		HAL_Delay(20);
		if(GPIO_Pin == GPIO_PIN_9){
			switch(dac_mode){
				case 1: pl_100 = (pl_100>=100)?10:pl_100+10;finds(65625/pl_100/10,&B,&C);break;
				case 2: pl_100 = (pl_100>=100)?50:pl_100+10;finds(65625/pl_100/10,&B,&C);break;
				case 3: pl_100 = (pl_100>=500)?250:pl_100+50;finds(262500/pl_100/10,&B,&C);break;
				default: pl_100 = 2;break;
			}
		}
	}
	printf("模式:%s 频率:%dHz   Vpp:%.1fV\r\n\r\n\r\n\r\n",Mode[dac_mode],pl_100*100,(double)dy_10/10);  //串口输出
}

3、自定义函数finds

此函数计算当频率pl给定时,PSC和ARR乘积何时最接近pl

void finds(int A, int *B, int *C) {
	int sqrtA = sqrt(A),ii;
	for (ii = sqrtA; ii > 0; ii--) {
		if (A % ii == 0) {
			int j = A / ii;
			if (j <= 65535) {
				*B = ii;
				*C = j;
				break;
			}
		}
	}
	TIM2->ARR=*C-1;
	TIM2->PSC=*B-1;
}

完工

六、原理讲解

STM32CubeMX学习笔记(20)——DAC接口使用(输出正弦波)

【STM32】HAL库 STM32CubeMX教程十---DAC

STM32cubemx教程 DAC+TIM+DMA

七、源码提供(包括各波形的数据数组)

STM32DAC+DMA输出波形文章来源地址https://www.toymoban.com/news/detail-784189.html

到了这里,关于【STM32+HAL】DAC+DMA输出波形实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 Timer(定时器)+DMA输出PWM底层配置过程学习

    本文使用的芯片型号是STM32G030,写本文的目前是想记录学习下Timer借助DMA生成可变占空比PWM时的底层配置过程。 使用TIM1,配置就只改了图上的配置,系统时钟用的16M,分频选择15(16-1),自动重装载寄存器ARR选择999(1000-1),那么生成的就是1kHz的PWM,这里为什么要减1,因为这俩是

    2024年04月09日
    浏览(63)
  • stm32——hal库学习笔记(DAC)

    相关HAL库函数介绍 关键结构体介绍(F1为例) adc3.c adc3.h dac.c dac.h main.c dac.c dac.h main.c dac3.c dac3.h dac.c dac.h main.c 6.2.1,什么是PWM DAC技术? 6.2.2,用分段函数表示PWM波 6.2.3,将PWM波分段函数进行傅里叶级数展开 6.2.4,PWM DAC的分辨率 6.2.5,8位分辨率下对RC滤波器的设计要求 6.2.6,

    2024年02月22日
    浏览(51)
  • STM32CubeMx实现ADC多通道+DMA读取(HAL库)

    目录 一、实验结果  二、STM32CubeMx配置 三、main.c测试代码 1、RCC配置 (外部晶振选择8MHz。设置相应的分频器M=8,倍频器倍频系数N=336,分频器分频系数P=2,那么主PLL生成的第一个输出高速时钟PLLP为:168MHz)  2、SYS配置  3、ADC(规则)通道配置(独立模式,预分频4分频,1

    2024年02月15日
    浏览(56)
  • 【STM32 HAL库实战】串口DMA + 空闲中断 实现不定长数据接收

    STM32CubeMX最新版: 打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR,在Commercial Part Number 中输入MCU型号,例如我在这里输入了STM32L431RCT6。选中正确型号然后双击进入下一步的配置界面。 1.1 SYS配置如图 1.2 RCC配置如图 开启了外部晶振,若无则都选择Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    浏览(80)
  • 【STM32】HAL库 STM32CubeMX——DMA (串口DMA发送接收)

    软件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦线,面包板,USB转TTL DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道系统的运

    2024年02月12日
    浏览(66)
  • STM32CubeMX配置HAL库实现SPI-DMA的递归调用

    核心: STM32F407ZET6   外设ADC: ADS1258   数量:3个   ※ 核心与3个ADC使用SPI总线 “一主多从” 方式连接,PCB布线的方式与下图一致。 ※ 在电路板上STM32与三个ADS1258在同一直线上分布,STM32在一端,三个ADC依次排布。 ※ 离STM32最远ADC的DRDY硬件管脚与STM32的EXTI line4 interrupt连接

    2024年02月15日
    浏览(50)
  • HAL库 STM32运用DMA与IDLE中断实现高效串口通信 (附代码)

    最近想做一个控制电机的项目,其中会用到Pytho与单片机STM32之间的互同,最近也在看一些关于数据通信和拆包的相关知识,所以记录一下这段时间里对两者之间的互通所做的事情和发现的问题,以供自己和大家参考。 单片机的串口是我们常用的与电脑通信的外设,本次与P

    2024年01月22日
    浏览(57)
  • STM32 HAL DMA中断配置

    使用HAL库方式DMA中断时,在网上找了好多资料都没有怎么介绍。所以就自己研究了一下,并做个记录。我的芯片型号是STM32G030。下面我以I2C传数据为例介绍下HAL库是如何使用DMA中断的。 我使用的是I2C2,简单配置下参数,加上DMA通道。 DMA貌似默认开启了中断,蓝色的勾勾是我

    2024年04月23日
    浏览(46)
  • 蓝桥杯嵌入式STM32 G431 hal库开发速成——ADC与DAC

    模数转换器(ADC):它将模拟信号转换为单片机能够处理的数字信号。在很多应用中,比如温度传感器、压力传感器等,信号最初都是模拟形式的。ADC 读取这些模拟信号,然后将它们转换为数字形式,以便单片机可以读取和处理。 数模转换器(DAC):它执行相反的操作,将

    2024年02月01日
    浏览(63)
  • STM32 HAL库 ADC+DMA

       软件触发:STM32 HAL库 软件触发ADC 多通道连续转换_随风飘零翼的博客-CSDN博客 配置如图      注意采样周期不要过小,不然频繁中断会导致在RTOS中卡死 写了部分关键代码,在两个任务中OLED和串口打印分别显示的通道值。 后来发现使用的杜邦线接触不良,固定好之后,接

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包