stm32定时器时钟以及中间对齐模式
在永磁同步电机的控制中,需要对电机的三相定子施加一定的电压,才能控制电机转动。现在用的较多的是SVPWM(SVPWM的具体原理会在后面另写一篇博客说明),要想产生SVPWM波形,需要控制的三相电压呈如下形式,即A、B、C三相的电压是中间对齐的,这就需要用到stm32定时器的中间对齐模式了。
1、stm32的时钟树
stm32的时钟树如下图所示,简单介绍一下stm32时钟的配置过程。以外部时钟作为时钟源为例。HSE代表外部时钟(假设为8M)、SYSCLK为系统时钟,经过倍频器之后变成168M、SYSCLK经过AHB预分频器(假设分频系数为1)后变成HCLK时钟等于系统时钟SYSCLK,HCLK即AHB外部总线时钟,经过APB预分频器分出APB1时钟(分频系数为2,低速设备SYSCLK/4)与APB2时钟(分频系数为1,高速设备SYSCLK/2)
HSE->SYSCLK->HCLK->APB1、APB2。
针对stm32f427的配置源码如下
2、stm32定时器的时钟
stm32定时器分为高级定时器(TIM1与TIM8)、通用定时器(TIM2-TIM5、TIM9-TIM14)、基本定时器(TIM6、TIM7)。不同的定时器使用不同的时钟。
其中TIM1、TIM8、TIM10、TIM11使用的是APB2时钟,而其余定时器使用的是APB1时钟。
在stm32手册中有这么一段话
根据前面RCC配置可以知道TIM1、TIM8、TIM10、TIM11使用的时钟频率为SYSCLK,其他定时器使用的时钟频率为SYSCLK/2
3、stm32定时器1的中间对齐模式
对齐模式的图示如下图所示,可以看到在中心对齐模式下产生的PWM波形的周期比实际计数周期要大1倍,所以假设要使用中间对齐模式,并且需要产生的PWM波频率为20K,那么对应的定时器时基应该设为40K。
在SVPWM波的产生过程中使用的是定时器1的3对互补的PWM通道,它的配置如下
static void SetSysClock(void)
{
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/******************************************************************************/
/* PLL (clocked by HSE) used as System clock source */
/******************************************************************************/__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* Enable HSE */RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHB时钟 #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) /* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2时钟/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1时钟
#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx *//* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);/* Enable the main PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till the main PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}#if defined (STM32F427_437xx) || defined (STM32F429_439xx)/* Enable the Over-drive to extend the clock frequency to 180 Mhz */PWR->CR |= PWR_CR_ODEN;while((PWR->CSR & PWR_CSR_ODRDY) == 0){}PWR->CR |= PWR_CR_ODSWEN;while((PWR->CSR & PWR_CSR_ODSWRDY) == 0){} /* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F427_437x || STM32F429_439xx *//* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}
}
static void TIM1_Configuration(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//使能定时器1时钟Time1_Period = (SystemCoreClock / 40000 );//定时器频率为APB2频率的2倍=HCLK 自动重装载为40K,最大值为4200Limit_Pluse_Max_Value = Time1_Period * 0.95;/* TIM1 Peripheral Configuration */ TIM_DeInit(TIM1);/* Time Base configuration *///配置定时器的计数方式为中间对齐方式,所以产生的PWM波的频率为20KTIM_TimeBaseStructure.TIM_Prescaler = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//TIM_CounterMode_Up;TIM_CounterMode_CenterAligned1TIM_TimeBaseStructure.TIM_Period = Time1_Period - 1;//PERIOD;//定时器时基40KTIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);/* Channel 1, 2,3 and 4 Configuration in PWM mode */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = Time1_Period / 2;//CCR1_Val; //占空比50%TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low;TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//TIM_OCNPolarity_Low;TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM1,&TIM_OCInitStructure); TIM_OCInitStructure.TIM_Pulse = Time1_Period / 2;//CCR2_Val;//占空比50%TIM_OC2Init(TIM1,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse = Time1_Period / 2;//CCR3_Val;//占空比50%TIM_OC3Init(TIM1,&TIM_OCInitStructure);// /* Channel 4 Configuration in OC */
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
// TIM_OCInitStructure.TIM_Pulse = 4000;//Time1_Period / 2; //1500;//PERIOD - 1;
//
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; // TIM_OC4Init(TIM1,&TIM_OCInitStructure); /* TIMx->CCMR1的bit3设为1:输出比较寄存器预装载使能 */ // PWM占空比改变只在更新事件时生效TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//A相/* TIMx->CCMR1的bit11设为1:输出比较寄存器预装载使能 */ // PWM占空比改变只在更新事件时生效TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);//B相/* TIMx->CCMR2的bit3设为1:输出比较寄存器预装载使能 */ // PWM占空比改变只在更新事件时生效TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);//C相// TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);//电磁铁/* Automatic Output enable, Break, dead time and lock configuration*/TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_DeadTime = 50;TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;//TIM_Break_Enable;TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;//TIM_AutomaticOutput_Enable;TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);/* TIM1 counter enable */
// TIM_Cmd(TIM1,ENABLE);/* Main Output Enable */TIM_CtrlPWMOutputs(TIM1,ENABLE);//由于使用中间对齐模式,PWM频率为20K//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//定时器1的溢出中断
}
stm32定时器时钟以及中间对齐模式相关推荐
- 1218 图片对齐模式
1218 图片对齐模式 行线 图片对齐模式 作用于img标签上
- 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式
文章目录 前言 1.PWM输入模式 2.硬件设计 3.软件设计 前言 STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获 ...
- 浅谈STM32的三种Boot模式
文章目录 一.关于BOOT模式的介绍 二.实际例子进行分析 三.分析上电启动流程 四.小结 五.参考资料 一.关于BOOT模式的介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的 ...
- STM32的三种Boot模式的差异
STM32的三种Boot模式的差异 一. STM32启动配置 二. 内置SRAM简介 三. 例程验证 3.1 硬件设置 3.2 创建工程调试版本 3.3 配置分散加载文件 3.5 配置中断向量表 3. ...
- 用Qt编写STM32烧录软件(ISP模式)
stm32有个自举模式,可以用来烧录程序. 我买的板子上有可以串口烧录功能,其中电路原理图如下(注意,这个图是错误的,因为正确的是三极管Q1.Q2分别一个为PNP一个为NPN,正确的图在这里): bo ...
- 定时器计数器中央双向对齐模式1/2/3
定时器计数器中央双向对齐模式1/2/3的区别 中央双向对齐计数模式 1,上下交替计数,输出标志位只在计数器向下计数时被置起: 中央双向对齐计数模式 2,上下交替计数,输出标志位只在计数器向上计数时被置 ...
- 用Qt编写STM32烧录软件(ISP模式)代码
1.前言 之前写了一篇[用Qt编写STM32烧录软件(ISP模式)],但是在文中没有具体的实现代码. 现在补上,各位有兴趣的同学可以参考以下.但是代码里面还有很多没有完善的,必定会存在一些bug,目前 ...
- STM32的三种Boot模式地址分配
STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...
- STM32的3种低功耗模式
STM32的3种低功耗模式: 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行. 停止模式:所有时钟都已停止:1.8V内核电源工作:PLL,HIS和HSERC振荡器功能禁止:寄存器和S ...
最新文章
- Django之初步实现登录功能,APP及ORM
- Controller的传参问题
- Cocos2d-x 脚本语言Lua中的面向对象
- 每年考研计算机专硕和学硕报比例,各院校研招计划发布 专硕与学硕比例调整...
- TextMate 通用快捷键
- 设置RDLC中table控件的表头在每页显示
- StarUML 破解方法2.X(转)
- boost helloworlld
- 有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...
- 红外报警c语言,基于单片机的红外报警系统设计 (毕业论文).docx
- MongoDB聚合(二)
- TabBars代码解读之——Visual Studio的自动化接口
- 如何下载行政区划地图
- 在vscode中使用opencv
- 50--出租车计费器
- 热点的ap频段哪个快_热点ap频段有什么区别
- Invalid use of SingleClientConnManager: connection still allocated. 解决方法
- 【第十一篇】字体设置css变形(transfom)4种
- msm8996平台的 camera 框架笔记
- 什么是埃博拉免疫T-细胞?
热门文章
- 华为鸿蒙os升级名单时间,华为鸿蒙系统升级时间表
- 夏日葵电商:搭建一个商城系统,N+功能方案揭秘!
- python修复老照片_10篇必读深度图像修复文章,珍贵老照片有救了!
- 寻找第K大的数(快排思想)
- 嵌入式成长轨迹27 【Linux应用编程强化】【中嵌第二阶段】【进程管理】
- linux yum安装ss5,Linux_SS5 安装笔记
- 快手java开发面试经验大全
- Linux网络适配器(Bridged(桥接模式),NAT(网络地址转换模式))设置IP连接外网,互拼
- 2019 CCPC Wannafly Camp Day 1
- 【音频】地球之歌 Earth Song (by Michael Jackson)