前置知识
流程图
计算公式
根据需求联立解出ARR,PSC,CCR的取值
主要用到的库函数
TIM_OCStructInit();//配置结构体TIM_OCInitStruct,初始化结构体所有成员变量
TIM_OC1Init()//初始化OC1通道,通道的位置看引脚图
TIM_SetCompare1()//设置CCR
主要代码
main.c
unsigned char i;
int main(void)
{
PWM_Init();
while (1)
{
for(i=0;i<=100;i++)
{
PWM_TIM_SetCompare1(i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_TIM_SetCompare1(100-i);
Delay_ms(10);
}
}
}
PWM.C
void PWM_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);//开启OC1引脚的时钟
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up ;
TIM_TimeBaseInitStruct.TIM_Period =100-1;//ARR
TIM_TimeBaseInitStruct.TIM_Prescaler=720-1 ;//PSC
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0 ;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_Pulse= 50;//CCR的值
TIM_OC1Init(TIM2, &TIM_OCInitStruct);
//配置OC1引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//必须是复用推挽输出,原因见下方补充
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_Cmd(TIM2,ENABLE);
}
void PWM_TIM_SetCompare1(uint16_t Compare1)
{
TIM_SetCompare1(TIM2,Compare1);
}
补充事项
(1)为什么选择复用推挽输出
一般情况下引脚的输出取决于单片机的输出数据寄存器,使用复用推挽输出模式,使输出控制与输出数据寄存器的通道断开,输出完全取决于外设(这里是定时器)