打印

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

[复制链接]
574|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-9-7 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32f4————PWM输出实验代码
/*******************************************************/
pwm.c源文件代码如下:   
//TIM14 PWM部分初始化   
//PWM输出初始化
//arr:自动重装值   psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{                  
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝