PWM基本结构:
主函数:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
uint8_t i;
int main(void)
{
OLED_Init();
PWM_Init();
while (1)
{
for (i = 0; i <= 100; i++)
{
PWM_SetCompare1(i);
Delay_ms(10);
}
for (i = 0; i <= 100; i++)
{
PWM_SetCompare1(100 - i);
Delay_ms(10);
}
}
}
PWM:
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//下面代码用来设置引脚重映射
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//首先开启AFIO
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//设置重映射
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//如果该引脚有调试功能还需要调用这段代码
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//必须选用复用推挽输出,这样PWM的波形才能通过引脚输出,GPIO_Mode_AF_PP 中的 AF 表示复用功能,PP 表示推挽输出模式。推挽输出模式是指引脚既能提供高电平输出,也能提供低电平输出,适用于驱动负载电流的应用。通过将 GPIO 引脚配置为GPIO_Mode_AF_PP 模式,可以将该引脚与特定的外设功能进行关联,并使用推挽输出模式驱动外设或其他电路。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);//将定时器配置为使用内部时钟作为时钟源
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//用于配置定时器的输出比较通道(Output Compare)的参数
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);//给结构体附初始值,如果调用类似TIM1高级定时器,就会用到一些我们没有赋值的属性,会导致出现一些bug,因此为了方便程序的修改移植,需加上初始化函数
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置PWM的比较模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//极性选择
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //CCR值
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);//开启时钟
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);//直接设置定时器CCR值
}
注意:
正常来说引脚的输出控制是由输出数据寄存器进行控制的,为了让内部时钟控制输出,需要设置为复用推挽输出。