STM32实现任意角度移相全桥PWM

MCU:STM32F334C8T6

最近因某些原因,需要用到任意角度移相的PWM波形来驱动全桥电路,本文记录实现过程。

类似于全桥整流器,将四个二极管换成开关器件,就是全桥逆变器,两个桥臂,需要用四路,两组互补的PWM波形来驱动,但此次的要求中,两组互补PWM波形不是完全相同的,而是有一定的相位差,而且此相位差可能是任意值。

关于互补PWM波的产生,比较简单,上一篇文章中讲了使用通用定时器的方法,本文使用高级定时器或者具有互补输出功能的通用定时器的TIMx_CHy和TIMx_CHyN通道产生,两个定时器分别产生两组互补PWM,并且占空比和频率都可以调节

(参见上一篇文章:如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM )

本文重点在于如何产生任意角度的移相。

于是开始翻阅STM32F334的官方手册,寻找相关定时器同步和主从模式的功能!

Slave mode: Gated mode

The counter can be enabled depending on the level of a selected input.

意思就是一个计时器可以利用输入信号来使能或失能

官方手册中给出了一个例子:

Using one timer to enable another timer
In this example, we control the enable of TIM2 with the output compare 1 of Timer 3. Refer
to Figure 205 for connections. TIM2 counts on the divided internal clock only when OC1REF
of TIM3 is high. Both counter clock frequencies are divided by 3 by the prescaler compared
to CK_INT (fCK_CNT = fCK_INT/3).
1. Configure TIM3 master mode to send its Output Compare 1 Reference (OC1REF)
signal as trigger output (MMS=100 in the TIM3_CR2 register).
2. Configure the TIM3 OC1REF waveform (TIM3_CCMR1 register).
3. Configure TIM2 to get the input trigger from TIM3 (TS=000 in the TIM2_SMCR
register).
4. Configure TIM2 in gated mode (SMS=101 in TIM2_SMCR register).
5. Enable TIM2 by writing ‘1 in the CEN bit (TIM2_CR1 register).
6. Start TIM3 by writing ‘1 in the CEN bit (TIM3_CR1 register).
Note: The counter 2 clock is not synchronized with counter 1, this mode only affects the TIM2
counter enable signal.

STM32F334C8T6这款芯片中,TIM2和TIM3都没有互补PWM输出功能,有互补输出功能的有高级定时器TIM1,通用定时器TIM15,16,17,

而要使用主从模式连接两个定时器,需要两个之间有输出和输入信号

从这三个表可以看出,只能选用TIM1和TIM15,并且TIM15为主TIM1为从

使用TIM1和TIM15的CH1和CH1N分别输出一组互补PWM,用TIM15_CH2输出触发信号OC2REF

 

确定了选用的定时器,接下来就是写程序,程序大概有以下几个部分:

 

  1. 计算参数  //参见上一篇文章
  2. 配置输出引脚
  3. 时钟基本配置                //参见上一篇文章
  4. 输出模式和参数配置 //参见上一篇文章
  5. 互补输出配置
  6. 主从模式和触发信号配置
  7. 使能时钟
  8. 修改触发信号//非常重要,否则输出出错
其中配置主从模式步骤如下:
1. Configure the Master Timers using the following functions:
 void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_TRGOSource);
 void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t
TIM_MasterSlaveMode);
2. Configure the Slave Timers using the following functions:
 void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_InputTriggerSource);
 void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

部分代码:

//#include "***"
//function name
{
uint16_t pulse=0 ,Period=0,shiftphase=0,deadtime=0;
uint16_t freq = 100000;//需要的频率,设定100k

//计算各个参数并赋值给对应变量,不使用死区,所以deadtime=0
	Period = 72*1000000 / freq; //计时器时钟为72MHz 时PWM 一个周期内的总计数次数
	pulse= Period * 45 /100 ;  // 脉冲宽度的计数次数,= 总次数* 占空比,占空比45?,可调
	shiftphase = Period *90/360;//设移相90度
	shiftphase += 340*72/1000;//移相补偿,此处补偿0.34us,见注释1

//配置GPIO 各引脚和相应的复用功能

//时钟基本配置,参见上一篇文章
	TIM_TimeBaseInit(PWM12_TIM, & TIM_TimeBaseInitStruct);
	TIM_TimeBaseInit(PWM34_TIM, & TIM_TimeBaseInitStruct);
//输出模式和参数配置,参见上一篇文章
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_Pulse = pulse ;//脉宽
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	//..........写入其他参数
	//PWM1,2
	TIM_OC1Init(TIM15, & TIM_OCInitStruct);
	TIM_OC1PreloadConfig(TIM15, TIM_OCPreload_Enable);

	//PWM3,4
	TIM_OC1Init(TIM1, & TIM_OCInitStruct);
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

	//触发信号
	TIM_OCInitStruct.TIM_Pulse =shiftphase;//触发信号的脉宽,也就是移相的量
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OC2Init(TIM15, &TIM_OCInitStruct);
	TIM_OC2PreloadConfig(TIM15, TIM_OCPreload_Enable);

	//配置主从模式
		//Master slave mode
	TIM_SelectOutputTrigger(TIM15, TIM_TRGOSource_OC2Ref);
	TIM_SelectMasterSlaveMode(TIM15, TIM_MasterSlaveMode_Enable);
	TIM_SelectInputTrigger(TIM1, TIM_TS_ITR0);
	TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);

	//使能定时器和PWM 输出
	//TIM_Cmd();
	//TIM_CtrlPWMOutputs();

	//使触发信号始终保持有效,非常重要的一步,见注释2
	while(TIM_GetFlagStatus(TIM15, TIM_FLAG_Trigger) == RESET);
	TIM_OCInitStruct.TIM_Pulse =Period;
	TIM_OC2Init(PWM12_TIM, &TIM_OCInitStruct);

	//完成
}

注释1:移相补偿,由于打开时钟,代码执行等都需要时间,会造成移相不准确,所以需要对移相值进行修正,也就是补偿,代码中给出的值0.34us是在频率100K情况下经测算得到的补偿值,此值在0~300度范围内具有较高精度,能达到+-0.003us(或+-0.02度),补偿值受很多因素影响,如频率,代码执行效率(汇编效率高),芯片芯能等。
移相最小值为1/720
注释2:由于TIM1工作在从模式的gatmode,只有在触发信号为高电平是才有效,计数器才会工作,所以一旦TIM1被触发,要时触发信号时钟处于高电平状态,才能保证TIM1正常工作,不然输出频率,占空比都会变化!(按我的理解此处在PWM_MODE1和TIM_OCPolarity_Low;情况下应设置TIM_Pulse=0,但实际上设置为TIM_Pulse=Period才正确,此处还没有想通为什么)
 

完整代码:

http://download.csdn.net/detail/wind4study/8562427
 
效果图:移相90度

 

wind 

2015,04,03

 

  • 31
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32F103移相全桥是一种使用STM32F103系列微控制器实现全桥电路,主要用于驱动电机或执行器的精确控制。全桥电路由四个电流控制器组成,能够以非常高的精度调节电机或执行器的转动位置或输出力矩。 STM32F103是一种基于ARM Cortex-M3内核的微控制器,具有强大的计算和控制能力。它集成了丰富的外设,包括多个定时器、PWM输出、ADC和DAC等模块,适用于各种工业自动化和嵌入式系统应用。 移相全桥的工作原理是将电机或执行器的驱动电流调节器分为两组,每组由两个分别用于上管和下管的电流控制器控制。通过对两组电流控制器的控制信号进行移相,可以实现电机或执行器的移相驱动,从而控制输出信号的相位和幅值。 使用STM32F103实现移相全桥需要编写相应的程序代码,包括配置和初始化相关的定时器、PWM输出和ADC等外设,以及编写移相算法实现对电流控制器的调节。在具体的应用中,还可以结合传感器的反馈信号,通过闭环控制方式实现更加精确的位置或力矩控制。 总之,STM32F103移相全桥是一种基于STM32F103微控制器的全桥电路,能够实现电机或执行器的精确控制。它具有强大的计算和控制能力,可以应用于各种工业自动化和嵌入式系统中。在具体的应用中,需要编写相应的程序代码和算法才能实现所需的功能。 ### 回答2: STM32F103 移相全桥是一种电路配置,通常用于控制交流电机。这种桥接配置利用STM32F103微控制器的数字输出和PWM功能,可以实现对电机相位和速度的精确控制。 在STM32F103中,我们可以配置多个GPIO引脚作为输出,并使用PWM来控制输出信号的占空比。对于移相全桥电路,我们需要至少4个GPIO引脚来控制电机的4个驱动电磁铁。 通过调整每个驱动电磁铁的PWM占空比和相位延迟,我们可以控制电机旋转方向和速度。在移相全桥电路中,通过交替激活驱动电磁铁,可以使电机在两个方向上旋转。这是因为当正向驱动电磁铁通电时,反向驱动电磁铁断电,反之亦然。 STM32F103微控制器具有高计算能力和精确的PWM调节功能,可以根据传感器和反馈信号实时调整PWM输出,从而控制移相全桥电路中的电机运行。通过编程和算法设计,我们可以实现一些高级功能,如速度闭环反馈控制、加速度/减速度控制等。 在实际应用中,我们可以将STM32F103连接到其他外设,如编码器、传感器和用户界面,以便进行更精确的控制和监测。此外,由于STM32F103具有较低的功耗和封装选项,使其非常适合用于移相全桥电路的嵌入式系统应用。 总结而言,STM32F103移相全桥电路是利用STM32F103微控制器和PWM调节功能来实现对电机相位和速度的控制。它具有高计算能力和精确控制的优势,适用于各种注重精度的电机控制应用。 ### 回答3: STM32F103是意法半导体(STMicroelectronics)公司生产的一款基于ARM Cortex-M3内核的32位微控制器。全桥电路是一种常见的电子电路,可以用于驱动直流电机和其他负载。移相全桥是基于全桥电路的一种应用,可以实现交流电的相位控制。 STM32F103可以通过引脚配置和定时器功能,灵活地实现全桥电路的移相控制。常见的移相方法有: 1. 正弦移相:通过改变PWM信号的相位,可以控制全桥电路中的开关时间,进而控制电流的相位,实现对交流电的移相控制。 2. 脉冲宽度移相:通过改变PWM信号的占空比,可以控制电流的开启时间,来实现移相控制。 在STM32F103中,可以使用定时器来产生PWM信号,控制全桥电路的驱动。使用定时器的不同通道可以控制不同的全桥电路开关。通过改变定时器的计数值和占空比,可以灵活地实现PWM信号的移相和脉宽控制。 另外,STM32F103还提供了丰富的外设和接口,可以与其他模块和传感器进行连接,进一步扩展应用范围。通过SPI、I2C、USART等接口,可以实现与其他芯片的通信,控制外部设备的状态。 综上所述,STM32F103移相全桥是利用STM32F103微控制器的定时器和PWM功能,通过改变信号的相位和占空比,实现全桥电路的移相控制。这种移相全桥电路可以应用于驱动直流电机和其他负载,扩展了STM32F103的应用领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值