小乐Tzz 发表于 2018-9-7 11:12

立创商城STM32F系列——STM32f4 PWM输出实验代码

STM32f4————PWM输出实验代码
/*******************************************************/
pwm.c源文件代码如下:   
//TIM14 PWM部分初始化   
//PWM输出初始化
//arr:自动重装值   psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{                  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
   
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//TIM14时钟使能      
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
   
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GF9复用为 TIM14
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                //GPIOF9   
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;      //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);                //初始化PF9
      
TIM_TimeBaseStructure.TIM_Prescaler=psc;//定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
   
//初始化TIM14 Channel1 PWM模式   
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM调制模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure);//初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);//使能预装载寄存器
   TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE 使能   
TIM_Cmd(TIM14, ENABLE);//使能TIM14                     
}
此部分代码包含了上面介绍的PWM输出设置的前5 个步骤。这里我们关于TIM14 的设置就不再说了。   
接下来,我们看看主程序里面的main函数如下:
int main(void)
{   
u16 led0pwmval=0;      
u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168);//初始化延时函数
uart_init(115200);//初始化串口波特率为115200
    TIM14_PWM_Init(500-1,84-1);//定时器时钟为84M,分频系数为84,所以计数频率
//为84M/84=1Mhz,重装载值500,所 以PWM频率为1M/500=2Khz.      
   while(1)   
{
      delay_ms(10);   
    if(dir)led0pwmval++;//dir==1 led0pwmval递增
    else led0pwmval--; //dir==0 led0pwmval递减   
      if(led0pwmval>300)dir=0;//led0pwmval到达 300后,方向为递减
    if(led0pwmval==0)dir=1;//led0pwmval递减到 0后,方向改为递增
   
    TIM_SetCompare1(TIM14,led0pwmval);//修改比较值,修改占空比
}
}
这里,我们从死循环函数可以看出,我们将led0pwmval这个值设置为PWM比较值,也就是通过 led0pwmval 来控制 PWM 的占空比,然后控制 led0pwmval 的值从 0 变到 300,然后又从 300变到0,如此循环,因此DS0 的亮度也会跟着信号的占空比变化从暗变到亮,然后又从亮变到暗。至于这里的值,我们为什么取 300,是因为PWM的输出占空比达到这个值的时候,我们的 LED 亮度变化就不大了(虽然最大值可以设置到 499),因此设计过大的值在这里是没必要的。至此,我们的软件设计就完成了。
/*******************************************************/


【立创商城】STM32F103CBT6 托盘https://item.szlcsc.com/8796.html
页: [1]
查看完整版本: 立创商城STM32F系列——STM32f4 PWM输出实验代码