【STM32F407】DAC波形输出和ADC采样,使用DMA功能

STM32CubeMX配置

时钟树

在这里插入图片描述

ADC

开启连续转换
计算ADC的采样率:
1/(15*(1/21M)) = 1.4M

21M: ADC时钟四分频,即84M/4。
15: ADC采样周期,3(设定)+12(固定值)。

一定要开启连续转换!

DAC

在这里插入图片描述
Output Buffer开启无法后输出0电压。

定时器

在这里插入图片描述
不做预分频
装载值设为100
定时器计数频率:84M/100 = 84e4
波形频率:84M/100/100(DAC每次输出100个点) = 8.4K
则每个点之间间隔:1/8.4K = 1.1905e-04秒。

按键中断

在这里插入图片描述
在这里插入图片描述

Keil程序编写

初始化

	uint16_t tri[]={1861, 1874, 1886, 1899, 1912, 1924, 1937, 1950, 1962, 1975, 
				    1988, 2000, 2013, 2026, 2038, 2051, 2064, 2076, 2089, 2102, 
				    2114, 2127, 2140, 2152, 2165, 2178, 2191, 2203, 2216, 2229, 
				    2241, 2254, 2267, 2279, 2292, 2305, 2317, 2330, 2343, 2355, 
				    2368, 2381, 2393, 2406, 2419, 2431, 2444, 2457, 2469, 2482, 
				    2482, 2469, 2457, 2444, 2431, 2419, 2406, 2393, 2381, 2368, 
				    2355, 2343, 2330, 2317, 2305, 2292, 2279, 2267, 2254, 2241, 
				    2229, 2216, 2203, 2191, 2178, 2165, 2152, 2140, 2127, 2114, 
				    2102, 2089, 2076, 2064, 2051, 2038, 2026, 2013, 2000, 1988, 
				    1975, 1962, 1950, 1937, 1924, 1912, 1899, 1886, 1874, 1861,
  };
				    
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_DAC_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_TIM6_Init();
  HAL_TIM_Base_Start(&htim6);
  HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)tri, DAC_P, DAC_ALIGN_12B_R);

务必加上HAL_TIM_Base_Start(&htim6);

按键中断服务

按键上升沿触发,并使用串口输出ADC采样值。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==KEY_Pin)
	{
		HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, ADC_P);
		for(j=0;j<ADC_P;j++)
		{
			printf("%d\n\r", adc_value[j]);
		}
		HAL_ADC_Stop_DMA(&hadc1);
	}
}

添加串口printf功能

头文件要加上stdio.h。

int fputc(int c, FILE * f)
{
	uint8_t ch;
	ch = c;
	HAL_UART_Transmit(&huart1, &ch, 1, 1000);
	return ch;
}

Matlab绘图

datatable = importdata('SaveWindows2023_8_29_10-57-15.TXT');
Fs=1.4e6;                                 %采样频率

N=length(datatable)
t = 1:N;
subplot(3,1,1);
plot(t,datatable);
title('Original Signal');
xlabel('Time'); 
ylabel('Amplitude'); 

subplot(3,1,2);
y0 = abs(fft(datatable));              
%横坐标为频率f= n*(fs/N)
f = (0:N-1)*Fs/N;                         %0N-1
plot(f,y0);
xlabel('Frequency'); 
ylabel('Amplitude'); 

在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F407是一款基于ARM Cortex-M4内核的微控制器,它具有内置的数字模拟转换器(DAC),可用于生成波形信号。DAC波形发生器的工作原理如下: 首先,我们需要配置DAC的工作模式和时钟源。可以选择DAC的工作模式为连续模式或单次模式,连续模式下DAC会持续输出波形,单次模式下DAC只会输出一次波形。时钟源可以选择主时钟、外部时钟或者内部计时器。 然后,我们需要设置DAC输出电压范围。通常,DAC输出电压范围为0V到参考电压(通常为VDD或外部参考电压)之间。可以通过设置DAC的数据对齐方式和位数来确定输出电压范围的精度。 接下来,我们需要通过设置DAC的数据寄存器来确定要输出波形信号。DAC的数据寄存器是一个12位的寄存器,可以存储0到4095之间的值,对应不同的电压输出。可以通过编程设置不同的数值来生成不同的波形信号,如正弦波、方波或三角波。 最后,我们需要启动DAC的转换过程。通过设置DAC的控制寄存器,可以启动DAC的转换,并选择是否使能DAC中断。启动转换后,DAC会根据数据寄存器中的数值生成对应的波形信号,并输出DAC输出引脚。 综上所述,STM32F407DAC波形发生器可以通过配置工作模式、选择时钟源、设置输出电压范围、编程确定波形信号以及启动DAC转换过程来生成不同的波形信号。这为实现各种波形发生器应用提供了灵活和便捷的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值