利用stm32f103zetl单片机生成一个频率为 4-5KHz占空比为50%,峰峰值为 3.3v的方波,频率可以通过按键直接调整及步进可调,步进小于等于1Hz。和频率为12-15KHz峰峰值为2.2v的正弦波,频率可以通过按键直接调整及步进可调,步进小于等于16Hz
时间: 2024-02-01 14:12:10 浏览: 67
stm32f103方波频率测量.zip_stm32f103测频率_方波_测波形频率_测量波形频率_测频率
5星 · 资源好评率100%
生成方波可以使用STM32F103内部的定时器,具体步骤如下:
1. 配置定时器时钟源
选择定时器的时钟源,可以选择内部时钟或外部时钟,这里我们选择内部时钟。
```
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
```
2. 定时器参数配置
设置定时器的分频系数和计数器的自动重装值,以实现所需的频率和占空比。在这里,我们将分频系数设置为7199,计数器自动重装值设置为5,这样定时器的时钟频率为72MHz/(7199+1)=10kHz,计数器自动重装值为5时,定时器的周期为6/10kHz=0.6ms。因此,我们可以通过改变计数器的值来产生不同占空比的方波。
```
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 5;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
```
3. 定时器通道配置
选择定时器输出比较通道,设置输出模式和输出极性,以及初始占空比。在这里,我们选择通道1,输出模式为PWM模式1,输出极性为低电平有效,初始占空比为50%。
```
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
```
4. 启动定时器
```
TIM_Cmd(TIM2, ENABLE);
```
5. 调整频率和占空比
通过修改计数器的自动重装值来改变频率,通过修改通道的比较值来改变占空比。
生成正弦波可以使用DAC(数字模拟转换器)输出波形,具体步骤如下:
1. 配置DAC
启用DAC时钟,并设置DAC的输出缓冲和DMA功能。
```
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
DAC_InitTypeDef DAC_InitStructure;
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
```
2. 生成正弦波数据
生成一组正弦波数据,存储在数组中,数组大小为256。
3. 启动DAC
启动DAC,并设置DMA传输模式。
```
DAC_Cmd(DAC_Channel_1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 256;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel3, ENABLE);
```
4. 调整频率
通过修改DMA传输的频率来改变正弦波的频率。可以使用定时器或外部中断触发DMA传输,以达到可调频率的效果。
阅读全文