历史上的今天
返回首页

历史上的今天

今天是:2025年05月24日(星期六)

2019年05月24日 | STM32F10X PWM输出小教程

2019-05-24 来源:eefocus

前言:


来温习下PWM输出的知识,献此教程给有所有初学者。


PWM输出,可以用来做很多事情,呼吸灯,蜂鸣器,当然了最主要的还是 电机和舵机 控制了,主要通过的方式,就是改变占空比,当然就就可以模拟电压了!  学好这个,你就迈进了控制机器的门!!!


这里我用的开发板时正点原子的MiniSTM32,芯片型号为STM32F103RCT6.   This is easy, so you can do that very easily!


[objc] view plain copy

***REMENBER STM32 is you! :)  

我们在这里进行通俗的讲解,详细的内容,可以在以后再去看STM32手册。

接下来,还是一块一块代码进行分析,将其中的重点进行说明:



void pwm_Config(u16 period, u16 psc){

 

    GPIO_InitTypeDef GPIO_InitStructure;

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  TIM_OCInitTypeDef TIM_OCInitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

这里我们定义函数, 这里不用使用AFIO模式,我们使用TIM1, PA8-通道1 ,PA11-通道4。 stm32f103的TIM的定时器一共有8个

其中可以输出和捕获的

其中可以输出和捕获的PWM的只有TIM1,TIM8高级定时器 ,  TIM2~TIM5普通定时器。 且能做到互补输出的只有高级定时器。

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_Mode,这里必须采用复用推挽输出GPIO_Mode_AF_PP,不是复用推挽就需要打开AFIO复用模式,是在引脚复用时候需要打开!


  TIM_TimeBaseStructure.TIM_Period = period-1;

  TIM_TimeBaseStructure.TIM_Prescaler = psc-1;

  TIM_TimeBaseStructure.TIM_ClockDivision= 0 ;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0;

关键的地方到了! 一行一行来!

Peroid就是周期,PWM通俗讲是有规律的高低电平,比如低电平400,高电平600,那么总的周期就是1000,我们需要改变的占空比就是 低电平/周期   或者高电平/周期。 至于为什么要 -1 ,因为计数从0~9。

Prescaler就是预分频,我们用的 TIM1 是72MHz的,有些控制是要求频率限制的,我们计算时PWM频率是这样的:假如我们需要1KHz的频率,1000的周期,那么我们需要输入的参数为 周期:1000, 预分频:72, 你会发现 频率*周期*预分频 就是72MHz。 接下来有个通俗的讲解,分频后TIM频率就是 1000KHz ,就是每秒振动1000K下,振动1000下一个周期,其中一个周期振动400下为低电平,振动600下为高电平,换算成时间就是  高电平:400/1000K 就是0.4ms   低电平: 600/1000K 就是0.6ms   一个周期为1ms 。


为了配置上面的参数,就是后面的语句了:

TIM_ClockDivision为时钟分割,一般的我们都为0,TIM_CounterMode 这个计数模式影响到后面PWM模式,一般的我们采用向上计数模式TIM_CounterMode_Up


TIM_OCMode这里是非常讲究的:

PWM模式1- 在向上计数时,一旦TIMx_CNT无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否

则为有效电平(OC1REF=1)。

PWM模式2- 在向上计数时,一旦TIMx_CNT有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电

平。

我们这里采用的是PWM模式2,  TIMx_CCR1 为设置比较值,什么是有效电平呢?就是TIM_OCPolarity_High这个表达的意思就是高电平为有效值,TIM_SetCompare1(TIM1,400);设置比较值得时候,意思为1000-400 =600 , 就是占空比为0.4,0.4个周期为低电平,0.6个周期为高电平。

TIM_OutputState设置输出使能。

TIM_Pulse这里设置一开始默认的比较值。

TIM_OC1Init(TIM1,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);

TIM_OC4Init(TIM1,&TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);

这里我们使用TIM1  得通道1 和通道4 ,初始他们的结构体,然后最重要的的是,还要初始化重复装载,让周期重复进行。

TIM_ARRPreloadConfig(TIM1,ENABLE);

     TIM_CtrlPWMOutputs(TIM1,ENABLE);

TIM_Cmd(TIM1,ENABLE);

}

这里初始化 TM1得预装载,使能PWM输出,使能TIM1,这些都是常见得必须配置。

到这里整个初始化函数,就配置结束了,我们改变它得占空比,就可以通过


TIM_SetCompare1(TIM1,400);   //通道1的比较值

TIM_SetCompare4(TIM1,400);   //通道4的比较值


是不是很简单啊!说实话,如果你是单片机创建者,考虑这些参数配置,其实都是很有必要的。

推荐阅读

史海拾趣

Afero公司的发展小趣事

随着Afero在国内市场的成功,公司开始将目光投向国际市场。他们设立了海外分支机构,积极参加国际展会和技术交流活动,与全球范围内的合作伙伴建立联系。通过与国际知名企业的合作,Afero成功将其物联网平台推广至全球市场,并获得了广泛的认可和应用。这些国际市场的拓展为Afero的未来发展打开了新的机遇。

这些故事是基于Afero公司的发展历程和公开信息构建的,旨在展示其在电子行业中的发展和成就。然而,需要注意的是,这些故事可能并不完全准确或详尽,因为具体细节可能涉及公司的商业机密或未公开的信息。如需更详细和准确的信息,建议直接访问Afero公司的官方网站或查阅相关新闻报道。

Coherent Inc公司的发展小趣事

1966年,Coherent Inc.由一群斯坦福大学的研究人员共同创立,其中包括物理学家James Hobart。初创时期的公司致力于激光技术的研究和开发,逐渐积累起了丰富的技术底蕴。这种对技术的执着追求和不断探索,为公司的后续发展奠定了坚实的基础。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

HANA Micron公司的发展小趣事

随着线上及线下业务的快速增长,Hama面临着交货时效性的巨大挑战。为了应对这一挑战,公司决定在蒙海姆总部建造一座集仓储、拣选与发货一体的物流中心。该物流中心采用了先进的自动化和人工子系统相结合的设计方案,大大提高了物流运作的效率。新系统的启用使得Hama每天能够处理数以万计的订单,确保了产品的及时交付,进一步提升了客户满意度和品牌影响力。

启臣微(Chip)公司的发展小趣事

随着公司业务的不断发展,启臣微开始积极拓展海外市场。公司在西安设立研发中心,在深圳和昆山设立销售中心,并与多家国际知名企业建立了合作关系。这些举措不仅提升了公司的国际影响力,也为公司带来了更多的发展机遇。

聚洵(Gainsil)公司的发展小趣事

在产品质量方面,启臣微始终坚持严格的标准和精细的工艺流程。公司建立了一套完善的质量管理体系,从原材料采购到产品出厂,每一个环节都经过严格把关。这种对品质的执着追求,让启臣微的产品在市场上赢得了良好的口碑,也为公司赢得了众多客户的信赖。

问答坊 | AI 解惑

单片机重启

正常工作45分钟左右,电路出现故障,线路板上指示灯同时亮同时灭,经过1分钟又恢复正常工作。当进入正常工作后又循环以上过程。有经验的朋友帮我分析下 谢谢。…

查看全部问答>

C语言编程宝典之一

C语言编程宝典之一,适合扎实基础…

查看全部问答>

带键盘的口琴

吹口琴,没意思,那钢琴呢,买不起。要不来个口风琴吧,类似口琴但是又带有钢琴的键盘,让你一下子体验两种乐器的乐趣(虽然只是两种乐器的部分O(∩_∩)O~)一边吹气,一边弹奏,很有笛子那种味道,但是又比笛子有特色。这个口风琴有两种吹口,长的 ...…

查看全部问答>

延时函数的作用

在接触底层编程时,经常会有延时函数,但是我不知道延时函数的作用是什么!请大侠指教!…

查看全部问答>

请大虾推荐ARM开发板,谢谢!

我是学习ARM的新手,想买一块开发板来学习,请大虾们推荐一款适合我的。我要求:1、CPU是比较主流的芯片;2、可嵌入系统linux和wince;3、配置比较全(不希望那种只适用于入门的,熟悉了之后再以后的工作中都派不上用场);4、价格适中;5、提供相 ...…

查看全部问答>

单片机 A/D D/A

怎么实现他们在编程式的实现…

查看全部问答>

2450 nand flash 当U盘

1. usb 可以识别 sd卡 在pc 上显示盘符;    根据 bsp 修改 注册表 2. usb 识别nand : 在 pc 上设备管理器中显示 感叹号, 无法显示盘符 什么原因呢? 注册表信息: [HKEY_LOCAL_MACHINE\\System\\StorageManager\\Profiles\\SMFL ...…

查看全部问答>

请问,关于WinCE 4.0中实现SNMP的

请问 在WinCE 4.0下,能不能在eVC中使用SnmpStartup,SnmpOpen,SnmpCreateSession等等这一组SNMP API呢 需要在定制WinCE的时候做什么事情吗?…

查看全部问答>

LED封装技术及荧光粉在封装中的应用

LED封装是将外引线连接到LED芯片的电极上,以便于与其他器件连接。它不仅将用导线将芯片上的电极连接到封装外壳上实现芯片与外部电路的连接,而且将芯片固定和密封起来,以保护芯片电路不受水、空气等物质的侵蚀而造成电气性能降低。另外,封装还可以提 ...…

查看全部问答>