STM32F1 通过pwm发出正弦波的程序
时间: 2023-11-11 20:07:17 浏览: 116
利用STM32的PWM产生正弦波
5星 · 资源好评率100%
要通过 PWM 发出正弦波,需要使用以下步骤:
1. 设置 PWM 的周期和占空比,可以使用定时器的 ARR 和 CCR 寄存器来设置。
2. 计算正弦波的每个采样点的值,并将其存储在一个数组中。
3. 在定时器中断中,依次输出数组中的每个采样点,即可发出正弦波。
以下是一个基于 STM32F1 的 PWM 发出正弦波的程序示例:
```c
#include "stm32f10x.h"
#define PI 3.1415926
#define SAMPLE_NUM 100
uint16_t sin_table[SAMPLE_NUM];
void TIM2_IRQHandler(void)
{
static uint8_t idx = 0;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_SetCompare1(TIM2, sin_table[idx++]);
if (idx >= SAMPLE_NUM)
{
idx = 0;
}
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_Prescaler = 7200;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
for (uint8_t i = 0; i < SAMPLE_NUM; i++)
{
sin_table[i] = (uint16_t)((sin(i * 2 * PI / SAMPLE_NUM) + 1) * 500);
}
TIM_Cmd(TIM2, ENABLE);
while (1)
{
}
}
```
在这个例子中,使用了 TIM2 定时器的 PWM1 模式,并设置了周期为 1000 和占空比为 50%。在定时器中断中,依次输出 sin_table 数组中的每个采样点,即可发出正弦波。需要注意的是,这里使用了 sin 函数来计算正弦波的采样点,需要包含 math.h 头文件和链接 math 库。
阅读全文