使用STM32F103C8T6的TIM1定时器PWM互补输出(带死区),按下停止后保持低电平(标准库)

#include "stm32f10x.h"                  // Device header
void TIM1_PWM_Enable(void)
{
	TIM1->CCER |= 0x0005;  // 使能输出
}
void TIM1_PWM_Disable(void)
{
    TIM1->CCER &= ~0x0005;//必须得让互补的两位复位,使用0x0001的话在复位后第一次按下时还会出现一次高电平
}
int main(void)
{
	// 结构体声明
	GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//时基结构体,
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRStructure;

    // 时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);     //TIM1时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);   //使能PORTE时钟

    // IO配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度100MHz
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA8
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_Init(GPIOB,&GPIO_InitStructure);              //初始化PB13
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
		
    // 定时器配置
    TIM_TimeBaseStructure.TIM_Prescaler=1-1;  //定时器分频72/1=72M
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseStructure.TIM_Period=150-1;   //自动重装载值72M / 350 =480KHz		2.0833us
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 									/*禁用重复计数器*/
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器1

    // 定时器比较输出通道配置
    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=74;    //占空比:初始化
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  //输出极性高
	TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;   // 互补端输出极性高
	TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; // 输出空闲电平低
	TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; //互补输出空闲电平低

    TIM_OC1Init(TIM1, &TIM_OCInitStructure);  // OC1
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   //开启预装载,在更新时间后才会重新装载数值
// 刹车死区配置
	TIM_BDTRStructure.TIM_OSSRState=TIM_OSSRState_Disable; //运行模式下“关闭状态“选择
	TIM_BDTRStructure.TIM_OSSIState=TIM_OSSIState_Disable; //空闲模式下“关闭状态“选择
	TIM_BDTRStructure.TIM_LOCKLevel=TIM_LOCKLevel_OFF;// 写保护锁,不锁,锁住的话电平会来回跳动,我也没搞懂,大佬帮忙指教下
	TIM_BDTRStructure.TIM_DeadTime=0x0A; //DT = 10*2.0833us = 20.833us
	TIM_BDTRStructure.TIM_Break=TIM_Break_Disable;//失能刹车输入
	TIM_BDTRStructure.TIM_BreakPolarity=TIM_BreakPolarity_High; //刹车输入管脚极性高
	TIM_BDTRStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;// 自动输出功能使能
	TIM_BDTRConfig(TIM1,&TIM_BDTRStructure);
	TIM_ARRPreloadConfig(TIM1,ENABLE);//ARPE使能
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
    TIM_CtrlPWMOutputs(TIM1, ENABLE); //开启OC和OCN输出

	while (1)
	{
		uint16_t key = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);
		if(key == Bit_RESET)//按下按键停止互补PWM输出
		{
			TIM1_PWM_Disable();//测试正常如图1-1
		}
		else
		{
			TIM1_PWM_Enable();
		}		
	}
}

按键按下后

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至安_enne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值