HAL STM32F103C8T6输出相位可调占空比可调的四路互补PWM波

HAL STM32F103C8T6输出相位可调占空比可调的四路互补PWM波

需求分析

最近接到了一个项目,顾客需要输出如下图所示的四路互补PWM波,频率为100khz,但又不能完全互补,第一路PWM和第二路PWM要留一定的死死区,不让PWM1和PWM2同时导通。
顾客的PWM输出需求如下:
近似互补PWM输出

原理分析

本项目可以用ITR0-ITR3实现定时器TIM1-TIM4的链式触发,我们可以根据下图来配置触发源。
触发信号源
具体思路思路如下:
1.配置定时器TIM1的通道1为触发源,用于触发定时器TIM2,TIM1的通道2输出PWM1 。
2.配置定时器TIM2的通道1为触发源,用于触发定时器TIM3,TIM2的通道2输出PWM2。
3.配置定时器TIM3的通道1为触发源,用于触发定时器TIM4,TIM3的通道2输出PWM3。
4.配置定时器TIM4的通道3输出PWM4。
通过上面的四步可以实现输出相位可调占空比可调的四路互补PWM波。

硬件选择

本项目采用价格便宜的STM32F103C8T6作为互补PWM波发生器,STM32F103C8T6如下图所示:
STM32F103C8T6

STM32cubeMX配置

设置RCC

设置RCC

设置SYS

设置SYS

clock配置

clock配置

TIM1配置

clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
由于客户要求PWM频率为100Khz,因此
prescaler设置为1-1
counter period设置为720-1
TIM1部分配置
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM1其余部分保持默认即可
TIM1部分配置

TIM2配置

slave mode选reset mode
trigger source选ITR0
clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
prescaler设置为1-1
counter period设置为720-1
TIM2部分配置
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM2其余部分保持默认即可
TIM2部分配置

TIM3配置

slave mode选reset mode
trigger source选ITR1
clock source选internal clock
channel1选PWM generation no output
channel2选PWM generation CH2
prescaler设置为1-1
counter period设置为720-1
TIM3部分配置
Master/Slave Mode选Enable
Trigger Event Selection选Compare Pulse (OC1)
TIM3其余部分保持默认即可
TIM3部分配置

TIM4配置

slave mode选reset mode
trigger source选ITR2
clock source选internal clock
channel3选PWM generation CH3
prescaler设置为1-1
counter period设置为720-1
其余配置保持默认
TIM4配置

MDK程序生成

点击位置1想生成的目标程序平台
点击位置2生成目标程序
MDK程序生成

keil程序编写

主要在这两处添加程序

位置1

/* USER CODE BEGIN 2 */
	offset1=720.0/100.0*PWM;
	if(PWM<50)
	{
		offset2=720.0/100.0*(50-PWM);
	}
	else
	{
		offset2=720.0/100.0*(150-PWM);
	}
	offset3=720.0/100.0*PWM;
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,offset1);
	
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,offset2);
	
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,offset3);
	
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);

  /* USER CODE END 2 */

程序位置1

位置2

		//__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,360);
		__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,PWM/100.0*(720-1));
		__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,(100-PWM)/100.0*(720-1));
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,PWM/100.0*(720-1));
		__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,(100-PWM)/100.0*(720-1));
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

程序位置2

结果

这里用keil5的仿真和用示波器实际测试输出波形

仿真结果

从仿真结果看,输出的四路PWM波满足了项目的设计需求
仿真结果

示波器实际测试输出波形

从实际的示波器输出波形看,也满足了项目的设计需求。
示波器输出波形1
示波器输出波形2

写在最后

博主长期接STM32等项目,有需求的读者可以找我。
若读者想要完整的STM32cubeMX配置或者MDK工程的话,请评论留言获取
或者添加v信:whhuashou
或者扫描闲鱼联系
闲鱼联系方式

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在STM32F103C8T6微控制器上实现互补PWM输出,您可以按照以下步骤进行操作: 1. 配置定时器: - 选择一个定时器作为PWM输出的基础定时器。在STM32F103C8T6上,您可以选择TIM1、TIM2或TIM3作为基础定时器。 - 配置定时器的时钟源和时钟分频系数,以满足您的要求。 - 设置定时器的计数模式为向上计数模式。 2. 配置PWM输出通道: - 配置至少两个PWM输出通道。在STM32F103C8T6上,可以选择TIM1_CH1和TIM1_CH2、TIM1_CH3和TIM1_CH4、TIM2_CH1和TIM2_CH2等通道。 - 设置PWM模式为PWM模式1,即通道在大于比较值时为高电平,否则为低电平。 - 配置通道的比较值,以确定PWM占空比。 3. 配置互补输出模式: - 启用互补输出模式,以便两个PWM输出通道能够生成互补PWM形。 4. 启动定时器: - 启动定时器,开始生成PWM形。 以下是使用STM32Cube HAL库实现互补PWM输出的示例代码: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim1; void MX_TIM1_Init(void) { TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; // 定时器周期 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; HAL_TIM_PWM_Init(&htim1); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 比较值,决定占空比,范围为0-999 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2); sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); } int main(void) { HAL_Init(); MX_TIM1_Init(); while (1) { } } ``` 请根据您的具体需求调整代码中的参数值,以生成所需的互补PWM形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值