你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32单片机产生PWM信号

[复制链接]
STMCU小助手 发布时间:2021-7-6 15:07
1、开发环境

目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
开发平台:KEIL 5
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。

2、目标

PWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)

占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例

配置单片机寄存器来产生PWM

使PA1引脚产生方波,

3、代码

pwm.c文件代码
  1. //TIM5 PWM部分初始化
  2. //PWM输出初始化
  3. //@arr:自动重装值   
  4. //@psc:时钟预分频数   单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us
  5. //功能:由PA1产生占空比50%的方波
  6. void TIM5_PWM_Init(u32 arr,u32 psc)
  7. {                                                         
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  11.         
  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);          //TIM5时钟使能   
  13.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         //使能PORTA时钟        
  14.         
  15.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
  16.         
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
  20.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
  22.         GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1
  23.          
  24.         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //16bit定时器分频   84Mhz/84 = 1MHz   
  25.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
  26.         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
  27.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //  时钟跳动1/168MHz
  28.         
  29.         TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5
  30.         
  31.         //初始化TIM5 Channe2         
  32.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  33.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  34.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
  35.         TIM_OC2Init(TIM5, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM5 2OC1

  36.         TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);  //使能TIM5在CCR1上的预装载寄存器

  37.           TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能
  38.         
  39.         TIM_Cmd(TIM5, ENABLE);  //使能TIM5

  40.         TIM_SetCompare2(TIM5,arr/2);        //修改比较值,修改占空比50%                                                                          
  41. }  

  42. void main(void)
  43. {
  44.         TIM5_PWM_Init(1000-1,84-1);        //arr=200 5KHz arr=1000 1Kh
  45.         while(1)
  46.         {
  47.         /*什么也不做*/
  48.         }
  49. }
复制代码


收藏 评论0 发布时间:2021-7-6 15:07

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版