历史上的今天
今天是:2024年10月05日(星期六)
2018年10月05日 | 【STM32电机方波】记录3——TIM1时基初始化配置
2018-10-05 来源:eefocus
定时器分类 :
STM32F1x 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。
基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。
通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。
高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。

高级定时器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传输。
史海拾趣
|
概述: CN3056是可以对单节锂离子或者锂-聚合物可充电电池进行恒流/恒压充电的充电器电路.该器件内部包括功率晶体管,应用时不需要外部的电流 检测电阻和阻流二极管.CN3056只需要极少的外围元器件,并且符合USB总线技术规范,非常适用于便携式应 ...… 查看全部问答> |
|
我是用C#进行开发的,直接部署到设备上运行没有问题,但是生成cab安装文件,在设备上安装失败,提示“文件不是有效windows CE安装文件”。系统是wince 5.0… 查看全部问答> |
|
WINDOWS MOBILE下导航软件(具备源代码)。 开发平台:EVC4.0 使用平台:WINDOWS MOBILE5,6 电子地图格式:MM4 地图转换工具:MAPINFO格式转到MM4(具备源代码)。 该软件是为台湾使用编写的,在大陆还没有版本问题。 现带全套代码,寻求合作 ...… 查看全部问答> |
|
uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被 ...… 查看全部问答> |
|
VHDL语言进行MCS-51兼容单片机ip核开发,给各位坛友见识一下我收藏的资料, [ 本帖最后由 awarenessxie 于 2012-9-3 21:32 编辑 ]… 查看全部问答> |
|
CES 大会上又有好玩意儿了。它是 StickNFind 公司推出的一个纽扣形状的追踪器,可以贴到任何物体上,通过蓝牙和手机上的一个 App 通信(iOS 和 Android 版均有),能给丢三落四的同学省去不少苦恼。这个 App 和这颗纽扣的通信有一个要求,就是在 ...… 查看全部问答> |
|
大家发现没有,美国大片里的好多科幻的玩意儿,都会在几年内实现,比如那个普罗米修斯里的测绘山洞的飞行仪器,其实我感觉就可以用四轴飞行器,加高精度360度激光,应该就能实现。 还有猜测梦境的东西,不是那个小日本已经能实现一部分了吗?好神 ...… 查看全部问答> |
|
对ADI的产品还算是比较了解的,之前用过他的DDS类的芯片,这个感觉不错,另外就是用过AD,DA,以及一个很快的比较器ADCMP600系列的,刚才太阳能伏光里面提到的有AD7606那个多通道的数模转换也很给力,ADI的前景很大,真的,就是芯片贵了点,另外指标 ...… 查看全部问答> |




