历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2018年09月22日 | 【STM32电机方波】记录3——TIM1时基初始化配置

2018-09-22 来源:eefocus

定时器分类 :
STM32F1x 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。

基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。

通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。

高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。 

【STM32电机方波】记录3——TIM1时基初始化配置



高级定时器TIM1的库函数:

【STM32电机方波】记录3——TIM1时基初始化配置


定时器TIM1时基结构体缺省值:

{

TIM1_Period =TIM1_Period_Reset_Mask;// 定时器周期,设定自动重载寄存器TIMx_ARR 的值

    TIM1_Prescaler = TIM1_Prescaler_Reset_Mask;//预分频器,设定TIMx_PSC 寄存器的值,

    TIM1_CKD =TIM1_CKD_DIV1;               // 时钟分频 

    TIM1_CounterMode = TIM1_CounterMode_Up; //计数模式(高级定时器有5种模式)

    TIM1_RepetitionCounter = TIM1_RepetitionCounter_Reset_Mask;//重复计数器 

}


TIM1 时基初始化及中断子程序配置:

void TIM1_TimeBaseInit(u16 arr,u16 psc)

{

 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM1时基结构体

 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①时钟 TIM1 使能

 

 TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器ARR周期的值

 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值

 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割

 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数

 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //计数频率为72MHz

 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIM1

 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //③允许更新中断  //中断优先级 NVIC 设置

 

 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1 中断

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 1 级

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能

 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器


 TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM1

}

void TIM1_IRQHandler(void) //TIM1 中断

{

    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查 TIM1 更新中断发生与否

   {

      TIM_ClearFlag(TIM1, TIM_IT_Update ); //清除 TIM1 更新中断标志

        ………………………………………………………………

    }

}

发生中断时间=(TIM_Prescaler+1)* (TIM_Period+1)/FLK


基本定时器的核心是时基,通用计时器和高级定时器也有。 对于高级定时器TIM1 来说:

1、时钟源 

定时器时钟TIMxCLK,即内部时钟CK_INT,经APB2预分频器后分频提供,如果APB2 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB2 预分频的系数是 2,即 PCLK2=36M,所以定时器时钟 TIMxCLK=36*2=72M 。 

2、计数器时钟 

定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。 

具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。 

3.计数器 

计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。 

4、自动重装载寄存器 

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。 

5. 定时时间的计算 

定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于: 1/CK_CLK *(ARR+1)*time。 



BLCD电机的起动:

按下功能键,令高级定时器TIM1 输出 PWM 方波、进入TIM1中断,通过两相通电法测定初始状态的电机。具体的操作是给任意两相通电,并控制电机电流不致过大,启动电机做一次换向,通电一段时间后,转子就会转到与该通电状态对应的预知位置,完成转子的定位

PWM输出:

PWM的配置在其结构体 TIM_Period(周期设定)、TIM_Prescaler(分频)、TIM_OCMode(输出模式)、TIM_OutputNState(互补输出状态)、TIM_Pulse(捕获比较器的值,即设定PWM的占空比)等的配置。另外对于BLDC来说,PWM波形使用TIM1产生,1、2、3三个通道产生3路PWM驱动六个MOSFET,4通道用于ADC采样,而ADC1扫描3个通道获取反电动势,其扫描结果由DMA传输。


推荐阅读

史海拾趣

CT [ Central Technologies ]公司的发展小趣事

经过数年的努力,CT公司终于研发出了一款具有颠覆性的新型芯片技术。这款芯片在性能上大幅超越了当时的同类产品,引起了市场的广泛关注。多家知名企业纷纷与CT公司展开合作,将这款芯片应用于他们的产品中。随着合作伙伴的增加和市场份额的扩大,CT公司的知名度逐渐提升,成为了电子行业的一匹黑马。

骏晔科技(DreamLNK)公司的发展小趣事

物联网设备的互操作性一直是行业内的挑战。骏晔科技在面对这一挑战时,积极寻求解决方案。公司通过与多家物联网系统提供商合作,共同推动物联网互操作性标准的制定和实施。同时,公司还针对不同类型的物联网设备,提供定制化的RF模块和解决方案,帮助客户实现设备的互联互通。

泽耀科技(Ashining)公司的发展小趣事

在国内市场取得一定成绩后,泽耀科技(Ashining)开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,泽耀科技还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

顺芯(Everest-semi)公司的发展小趣事

顺芯公司成立于XXXX年,初创时期面临着资金短缺、技术壁垒高和市场竞争激烈的挑战。然而,公司的创始人团队凭借对半导体行业的深刻理解和坚定信念,成功吸引了第一轮天使投资。他们夜以继日地研发产品,不断优化技术,终于在XXXX年成功推出了首款高性能的模拟芯片产品,获得了市场的初步认可。

BAND-IT公司的发展小趣事

1937年,在美国的科罗拉多州,BAND-IT公司应运而生。当时,电子行业正处于快速发展的初期,对高质量紧固件的需求日益增长。BAND-IT创始人敏锐地捕捉到了这一机遇,开始设计和制造不锈钢带和扎扣,以及C00169标准绑带机。这些产品迅速在电子行业中获得了认可,成为电缆、电线束等部件紧固的理想选择。初创时期的BAND-IT面临着资金短缺、市场竞争激烈等挑战,但凭借其创新的产品和卓越的品质,逐渐在电子行业中站稳了脚跟。

Fedco_Batteries公司的发展小趣事

Fedco_Batteries的创始人李先生,在电子产业蓬勃发展的年代,看到了电池领域的巨大潜力。他凭借对技术的热爱和对市场的敏锐洞察,决定投身电池制造行业。创业初期,公司面临着资金短缺、技术瓶颈等重重困难。然而,李先生带领团队日夜兼程,不断研发新型电池技术,最终成功推出了一款性价比高、性能稳定的电池产品,打开了市场的大门。

问答坊 | AI 解惑

调查一下,大家都用什么编译器?

我用的是ADS1.2 你们呢? 其他编译器有好用的么?…

查看全部问答>

运放稳定性分析(EN)

在 https://bbs.eeworld.com.cn/thread-72972-1-2.html 运放定性分析中,补充了该文件的原文资料,在那里我看大家没有注意这份资料,这里发个“广告”做个提醒(具体位置:10楼)。 [ 本帖最后由 xiaoxif 于 2009-3-14 18:52 编辑 ]…

查看全部问答>

dsp2812外扩一个521kx16RAM的CMD文件编写

在zone6区域外扩一个521kx16RAM,改写程序如下,请教有无问题,flash与ram编写有什么不同?外扩ram有一部分用于程序,一部分用于存储数据该如何编写 MEMORY { PAGE 0 :    BEGIN       : origin = 0x100000, le ...…

查看全部问答>

UCOSII 用什么编译器编译啊?

初学UCOS2, 想知道 这个系统的源代码通过什么编译器能生成机器执行的代码?…

查看全部问答>

跪求ADT IDE集成开发环境

     做硬件实验,用的是ARM嵌入式实验教学平台,但是没有ADT IDE集成开发环境,并且网上也下不到,急死我了。求求高人,有的给我发一份过来呀。      不过还真不好弄,不知道用邮件行不行呀。最好告诉我 ...…

查看全部问答>

18B20ROM搜索的一段代码能否帮忙看看,解释地清除点万分感谢

uchar search_rom(uchar *p) {   uchar dat,i,j,k,n,value,number=1,number_temp=1,clash_number=0;   bit clash_flag=0;   for(n=0;n>1;              DQ=1;_nop_(); ...…

查看全部问答>

TI C6000的分支指令B和nop指令

执行分支指令时,他的后续指令是否会被执行(同一指令包不同执行包或后面指令包的指令)? 执行多周期nop指令时,他的后继指令会继续在流水线上行进并被执行吗?…

查看全部问答>

如何在EVC中设置本机的IP地址

如何在EVC中编程设置本机的IP地址?查找到一个方法,就是直接写注册表,可是具体怎么写不知道。(用VC实现)   希望大家给提供方法,最好有代码,谢谢! …

查看全部问答>

手机快要用上雷达芯片

由欧盟资助、位于德国法兰克福的一个研发团队研发出一款新型低成本、手指甲般大小的雷达芯片,这种芯片可用于汽车、机器人和智能手机等领域。   该款芯片被视为全球体积最小的完整雷达芯片,其感应器发送和接收的无线电频率超过100GHz。 ...…

查看全部问答>