在永磁同步电机的控制中,需要对电机的三相定子施加一定的电压,才能控制电机转动。现在用的较多的是SVPWM(SVPWM的具体原理会在后面另写一篇博客说明),要想产生SVPWM波形,需要控制的三相电压呈如下形式,即A、B、C三相的电压是中间对齐的,这就需要用到stm32定时器的中间对齐模式了。

1、stm32的时钟树

stm32的时钟树如下图所示,简单介绍一下stm32时钟的配置过程。以外部时钟作为时钟源为例。HSE代表外部时钟(假设为8M)、SYSCLK为系统时钟,经过倍频器之后变成168M、SYSCLK经过AHB预分频器(假设分频系数为1)后变成HCLK时钟等于系统时钟SYSCLKHCLK即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定时器时钟以及中间对齐模式相关推荐

  1. 1218 图片对齐模式

    1218 图片对齐模式 行线 图片对齐模式 作用于img标签上

  2. 【蓝桥杯嵌入式】【STM32】13_PWM输入捕获模式

    文章目录 前言 1.PWM输入模式 2.硬件设计 3.软件设计 前言   STM32的定时器输入捕获模式可以通过更改输入捕获极性实现PWM的输入捕获,但实际上STM32也包含有非常方便的PWM输入捕获 ...

  3. 浅谈STM32的三种Boot模式

    文章目录 一.关于BOOT模式的介绍 二.实际例子进行分析 三.分析上电启动流程 四.小结 五.参考资料 一.关于BOOT模式的介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的 ...

  4. STM32的三种Boot模式的差异

    STM32的三种Boot模式的差异 一. STM32启动配置 二. 内置SRAM简介 三. 例程验证 3.1 硬件设置 3.2 创建工程调试版本 3.3 配置分散加载文件 3.5 配置中断向量表 3. ...

  5. 用Qt编写STM32烧录软件(ISP模式)

    stm32有个自举模式,可以用来烧录程序. 我买的板子上有可以串口烧录功能,其中电路原理图如下(注意,这个图是错误的,因为正确的是三极管Q1.Q2分别一个为PNP一个为NPN,正确的图在这里): bo ...

  6. 定时器计数器中央双向对齐模式1/2/3

    定时器计数器中央双向对齐模式1/2/3的区别 中央双向对齐计数模式 1,上下交替计数,输出标志位只在计数器向下计数时被置起: 中央双向对齐计数模式 2,上下交替计数,输出标志位只在计数器向上计数时被置 ...

  7. 用Qt编写STM32烧录软件(ISP模式)代码

    1.前言 之前写了一篇[用Qt编写STM32烧录软件(ISP模式)],但是在文中没有具体的实现代码. 现在补上,各位有兴趣的同学可以参考以下.但是代码里面还有很多没有完善的,必定会存在一些bug,目前 ...

  8. STM32的三种Boot模式地址分配

    STM32的三种Boot模式地址分配 一.STM32的三种Boot模式 1.主闪存存储器 2.系统存储器 3.内置SRAM 二.三种模式地址分配验证 主闪存存储器 系统存储器 三.汇编程序完成每间隔1 ...

  9. STM32的3种低功耗模式

    STM32的3种低功耗模式: 睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行. 停止模式:所有时钟都已停止:1.8V内核电源工作:PLL,HIS和HSERC振荡器功能禁止:寄存器和S ...

最新文章

  1. Django之初步实现登录功能,APP及ORM
  2. Controller的传参问题
  3. Cocos2d-x 脚本语言Lua中的面向对象
  4. 每年考研计算机专硕和学硕报比例,各院校研招计划发布 专硕与学硕比例调整...
  5. TextMate 通用快捷键
  6. 设置RDLC中table控件的表头在每页显示
  7. StarUML 破解方法2.X(转)
  8. boost helloworlld
  9. 有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...
  10. 红外报警c语言,基于单片机的红外报警系统设计 (毕业论文).docx
  11. MongoDB聚合(二)
  12. TabBars代码解读之——Visual Studio的自动化接口
  13. 如何下载行政区划地图
  14. 在vscode中使用opencv
  15. 50--出租车计费器
  16. 热点的ap频段哪个快_热点ap频段有什么区别
  17. Invalid use of SingleClientConnManager: connection still allocated. 解决方法
  18. 【第十一篇】字体设置css变形(transfom)4种
  19. msm8996平台的 camera 框架笔记
  20. 什么是埃博拉免疫T-细胞?

热门文章

  1. 华为鸿蒙os升级名单时间,华为鸿蒙系统升级时间表
  2. 夏日葵电商:搭建一个商城系统,N+功能方案揭秘!
  3. python修复老照片_10篇必读深度图像修复文章,珍贵老照片有救了!
  4. 寻找第K大的数(快排思想)
  5. 嵌入式成长轨迹27 【Linux应用编程强化】【中嵌第二阶段】【进程管理】
  6. linux yum安装ss5,Linux_SS5 安装笔记
  7. 快手java开发面试经验大全
  8. Linux网络适配器(Bridged(桥接模式),NAT(网络地址转换模式))设置IP连接外网,互拼
  9. 2019 CCPC Wannafly Camp Day 1
  10. 【音频】地球之歌 Earth Song (by Michael Jackson)