PWM简单理解就是生成PWM方波,主要可控的参数有周期,占空比,极性。

stm32内置PWM生成器,我想应该是用TIM加比较器来实现的吧,那么如何实现stm32输出PWM波呢?

一、得知道那些IO可以输出PWM,貌似带TIM的都能直接输出,这个可以在数据手册中查到。

我收头的板子要产生两路+12V/-12V的PWM,我打算用TIM5的CH1和CH4两个通道生成PWM,所以一路接PA0一路接PA3。

二、软件上要配置IO、TIM及比较器。

1.配置IO,mode = AF ,注意一定要开启AF功能GPIO_PinAFConfig();

    GPIO_InitTypeDef     GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource0, GPIO_AF_TIM5);
GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource3, GPIO_AF_TIM5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

2.配置TIM5参数,这里主要配置PWM的周期,这里其实配置的是TIM5的周期,也就意味着我的两路PWM是同频率的。这里主要使用到的是分频器Prescaler和倍频器Period两个寄存器,TIM5挂载在APB1上,即PCLK1的频率通过分频与倍频得到想要的PWM周期。

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 30000; //周期T=1/30M*30000=1ms
TIM_TimeBaseStructure.TIM_Prescaler = 0; //1+0=1分频 所以频率=30M/1=30M
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

3.配置极性,占空比之类的参数。注意一定要初始化响应的通道,通道1就是TIM_OC1Init();通道4就是TIM_OC4Init();

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse = 3*percent;//占空比=3*percent/30000=percent/10000=(10000-Charger_Config_Infor.u16_CP_PWM)/10000
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出极性:TIM输出比较极性低
TIM_OC1Init(TIM5, &TIM_OCInitStructure);//初始化外设TIMx_CHx
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);//使能TIMx在CCR2上的预装载寄存器
TIM_ARRPreloadConfig(TIM5, ENABLE);//使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM5, ENABLE);//使能TIMx外设

最新文章

  1. Linux驱动开发—— IS_ENABLED
  2. CloudNotes:一个云端个人笔记系统
  3. iOS开发,URL编码和解码
  4. js二级导航下拉菜单
  5. flex swf和movieclip之前的微妙关系
  6. zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
  7. hdu 2034人见人爱A-B
  8. 免安装jdk 和 免安装tomcat
  9. PHP常用文件函数和目录函数整理
  10. BZOJ 3872 Ant colony
  11. 如何实现一个通用的IHttpHandler 万能的IHttpHandler HttpWebRequest文件上传
  12. chrome误删书签恢复。
  13. IOS开发-UI学习-UINavigationController(导航控制器)的使用
  14. Spring中获取对象
  15. Java锁概念基础
  16. Oracle 10046
  17. 51nod 1185 || 51nod 1072 威佐夫博弈
  18. PBR Step by Step(四)Lambertian反射模型
  19. oracle 导入报错:field in data file exceeds maximum length
  20. 命令行编译工具NMAKE

热门文章

  1. golang 中mgo update报错: The dollar ($) prefixed field '$inc' in '$inc' is not valid for storage.
  2. Java异常之Error和Exception
  3. CryptoKit 实现 椭圆曲线ECC加密
  4. iOS 制作一个动态库
  5. linux查看java堆栈信息_linux进程堆栈大小
  6. 跨平台Docker篇
  7. 微服务笔记之Eureka03(服务续约分析)
  8. mybatis中xml新增一条数据获取自增id
  9. Jquery 简单实现demo
  10. Django初识(一)