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; %从0到N-1
plot(f,y0);
xlabel('Frequency');
ylabel('Amplitude');