历史上的今天
返回首页

历史上的今天

今天是:2025年06月29日(星期日)

2018年06月29日 | STM32F107高级定时器TIM1使用互补PWM输出

2018-06-29 来源:eefocus

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。
      先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。

Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:
AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。
在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。我用的库函数直接调用函数SystemInit();这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。定时器接下来还有一个分频寄存器:TIMX_PSC经过他的分频后,才是定时器计数的频率。所以真正的时钟频率应该是72mhz/(TIMX_PSC-1),我们设为tim_frepuency下面还会用到。
stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。时钟的频率弄好了下面终于可以开说重点PWM了。当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比。

高级定时器Tim1 互补死区输出std库代码:

void PWM_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure2;
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

 //时钟使能,管脚Rmap
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);
 GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
 TIM_DeInit(TIM1);
 TIM_InternalClockConfig(TIM1);

 //引脚配置
 //TIM1_CH1N
 GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
 GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_Init(GPIOE,&GPIO_InitStructure2);

 //TIM1_CH1
 GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_9;
 GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz; 
 GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_Init(GPIOE,&GPIO_InitStructure2);

 //定时器基本配置
 TIM_TimeBaseStructure.TIM_Period=2-1;
 TIM_TimeBaseStructure.TIM_Prescaler=72-1; 
 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
 TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

 //定时器比较输出配置
 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; 
 TIM_OCInitStructure.TIM_Pulse=1; 
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  
 TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; 
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; 
 //高级定时器才有的互补输出配置
 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
 TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
 TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; 
 TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
 TIM_OC1Init(TIM1,&TIM_OCInitStructure);

 //高级定时器死区配置
 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//ÔËÐÐģʽÏÂÊä³öÑ¡Ôñ
 TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//¿ÕÏÐģʽÏÂÑ¡Ôñ
 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //Ëø¶¨ÉèÖÃ
 TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; 
 TIM_BDTRInitStructure.TIM_DeadTime = 0x70; //ËÀÇøÊ±¼äÉèÖÃ
 TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //ɲ³µ¹¦ÄÜʹÄÜ
 TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//ɲ³µÊäÈ뼫ÐÔ
 TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//×Ô¶¯Êä³öʹÄÜ
 TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);  //ÅäÖÃËÀÇøÉèÖÃ

 //ccr1自动重装载
 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //ʹÄÜTIMXÔÚccr1ÉϵÄÔ¤×°ÔØ
 TIM_ARRPreloadConfig(TIM1, ENABLE);//ʹÄÜTIMXÔÚARRÉϵÄÔ¤×°ÔØ

 TIM_Cmd(TIM1,ENABLE); //´ò¿ªTIM1
 //高级定时器才有的主输出使能
 TIM_CtrlPWMOutputs(TIM1, ENABLE);

 //ÔÚÔËÐÐÖÐÏëÒª¸Ä±äPWMµÄƵÂʺÍÕ¼¿Õ±Èµ÷ÓãºTIM_SetAutoreload()
 //TIM_SetCompare1() ÕâÁ½¸öº¯Êý¾Í¿ÉÒÔÁË
}


推荐阅读

史海拾趣

Exar [Exar Corporation]公司的发展小趣事

进入21世纪后,数字视频应用的兴起为Exar提供了新的发展机遇。为了抓住这一机遇,公司在2000年推出了视频处理器和编解码器产品。这些产品不仅满足了市场对高质量视频处理的需求,也进一步巩固了Exar在通信和视频处理领域的地位。

Hirel Systems Ltd公司的发展小趣事

Exar始终注重通过收购和合并来增强自身的技术实力和市场竞争力。例如,2012年Exar收购了Integrated Memory Logic Limited(iML),这一举措加强了其在存储和数据管理领域的地位。通过收购iML,Exar获得了更多的技术资源和市场份额,为其后续的发展提供了有力支持。

DeLorme公司的发展小趣事

DeLorme公司成立于20世纪80年代初,当时正值全球定位系统(GPS)技术快速发展的时期。创始人XXX和XXX看到了GPS技术在户外导航领域的巨大潜力,于是决定投身这一领域。然而,创业初期他们面临了资金短缺、技术瓶颈和市场接受度低等多重挑战。他们通过不断的技术创新、优化产品设计和积极的市场推广,逐渐赢得了消费者的认可,并在行业内树立了良好的口碑。

DURACELL公司的发展小趣事

1920年,一位年轻而聪明的科学家山谬·鲁本(Samuel Ruben)和另一位年轻而富有的钨丝电线制造商菲立普·马洛里(Philip Rogers Mallory)在一次偶然的机会中相遇。鲁本到马洛里公司寻找实验设备,两人在交谈中共同意识到将发明天赋和制造力量结合起来的巨大机会。这个巧合开启了他们的合作之旅,最终导致了金霸电池的诞生。鲁本的发明为当时的电池科技带来了革命性的改变,奠定了DURACELL公司坚实的基础。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:人才是企业发展的第一资源。Hisetec Electronic Co Ltd公司始终将人才战略作为企业发展的核心战略之一。

发展:公司建立了完善的人才培养、引进和激励机制,积极吸引国内外优秀人才加盟。同时,公司还加强与高校和科研机构的合作,共同培养高素质的电子专业人才。此外,公司还注重员工的职业发展和企业文化建设,营造了良好的工作环境和氛围。这些举措为Hisetec公司的可持续发展提供了有力的人才保障。

请注意,以上故事均为虚构,旨在展示电子行业企业可能的发展路径和策略。实际上,Hisetec Electronic Co Ltd公司的具体发展历程和故事可能有所不同。

问答坊 | AI 解惑

【求助】USBASP制作中遇到的问题

我用的资料是从这下载的:https://bbs.eeworld.com.cn/thread-73210-1-8.html 板子上元件排布基本上也是参照照片上的,只是想在使用时,实验板的电源就用USB的VCC,所以去掉了J2。 烧固件时,用编程器烧的,USBASP板子连接电脑后,绿灯闪烁了三下 ...…

查看全部问答>

CPLD最实用的50例设计

详细说明:CPLD实用设计50例,非常经典的CPLD设计,包含50个实际的典型应用,涉及直流电机PWM驱动,编码等内容,有了这50例,举一反三,就会了很多应用 文件列表:   CPLD实用设计50例   ................\\基于DSP+CPLD的 ...…

查看全部问答>

5.0模拟器下有没有编辑注册表的软件

如题 类似WINXP下regedit的功能。 我现在编写程序写注册表好像都对,但是读的时候有时返回错误 GetLastError为1814。 我想找个软件看看我写进去的东西对不对。 另外,我把一个键保存在HKLM下 \\\\Drivers\\\\BuiltIn\\\\XXXX目录下, 那么 ...…

查看全部问答>

请教关于CE数据库同步的问题

各位神人好:     我想知道CE 数据库能否自动的将CE数据库中保存的数据插入更新到SQL Server中,并且不影响SQL Server数据库中之前保存的数据。               谢谢啦~我一定给分!…

查看全部问答>

刚开始学51,上传俩个刚做的仿真

看了单片机视频,现在上传自己用proteus做的仿真带程序,一个是流水灯,一个是数码管!希望能给提点意见。…

查看全部问答>

用STM32做音频项目,三种方案

现在用STM32做一个语音到站钟的项目,音质要求不高,就是报“一楼到了,上行”,“二楼是酒店”之类的语音,CPU上资源有PWM/DAC/IIS,通过上网查资料,网上解决的方案大体有以下三种: 1 PWM+SPI PWM模拟时钟时序,SPI传输数据,采用PCM编码 ...…

查看全部问答>

4X4的矩阵键盘

我用的是51学习板  ,这个板子P2口直接 4X4的键盘,  P1口控制数码管位选,P0口是段选。下面的数码管显示函数单独运行没有问题,直接给(0-99)的数就会直接显示。。。     我的思路就是把 4x4按下的相应代码 ...…

查看全部问答>

周计划提交

这是我写的,这是按照我的理解写的,不是很专业,我没有专业的设备,嘿嘿,示波器没有,没法测量各种波形了…

查看全部问答>

求毕设MSP430对温湿度采集程序

MSP430对温湿度采集程序,DTH11传感器,LCD1602显示屏,232串口…

查看全部问答>