前言:
PWM的输出也是定时器的基本功能之一,
这里我们将使用GPIOA中的GPIO_Pin_7做为TIM3第二通道的PWM输出实验
代码部分:
1.pwm.h:
#ifndef __PWM_H
#define __PWM_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
void TIM3_PWM_Init(u16 arr, u16 psc);
#endif
2.pwm.c:
#include "pwm.h"
void TIM3_PWM_Init(u16 arr, u16 psc) //GPIOA_Pin_7 --TIM3-通道2
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能GPIO外设时钟使能
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7; //TIM3_CH2
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Period=arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseInitStruct.TIM_Prescaler=psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStruct.TIM_Pulse=0 ;//设置待装入的脉冲值
TIM_OC2Init(TIM3,&TIM_OCInitStruct);
TIM_CtrlPWMOutputs(TIM3,ENABLE); // 主输出使能
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //CH2预装载使能
TIM_ARRPreloadConfig(TIM3,ENABLE); //使能TIM3在ARR上的预装载寄存器
TIM_Cmd(TIM3,ENABLE); //使能TIM3
}
3.main.c:
#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "pwm.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
int main(void)
{
u16 PWM=0;
u8 flag=1;
SysTick_Config(SystemCoreClock/1000);
STM3210B_LCD_Init();
LCD_Clear(Green);
LCD_SetBackColor(Black);//2
LCD_SetTextColor(White);//3
TIM3_PWM_Init(899,0);
while(1)
{
Delay_Ms(10);
if(flag) PWM++;
else PWM--;
if(PWM>300) flag=0;
if(PWM==0) flag=1;
TIM_SetCompare2(TIM2,PWM);
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
如果要查看pwm输出效果,要使用杜邦线接LED插在PA7引脚上才能看到代码完成程度
注意:关于如何控制PWM的占空比,如此文章展示的代码TIM_SetCompare2(TIM2,PWM);中的第二个? ? ? ? ? ? 入口参数就是我们控制PWM占空比的关键。
? ? ? ? ? TIM3_PWM_Init(899,0);中的第一个参数就是占空比的上限。
? ? ? ? ? 若要控制占空比为30%,则需要为TIM_SetCompare2(TIM2,300);? ?
? ? ? ? ??和? ?TIM3_PWM_Init(999,0);
? ? ? ? ??计算原理为300/1000为30%
总结
提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
|