STM32定时器----通用定时器输出带死区互补PWM

功能:利用一个普通定时器,输出2路互补的、频率可调、占空比可调、死区可调的PWM

原理:如下图,计数模式为中心对齐模式


可以看出,CH3高电平区间是以计数器计到4为中心,向两边延伸的。

而CH4,因为输出极性相反,是以0为中心向两边延伸的。

CCR3变小,占空比上升

CCR4变大,占空比上升

CCR3与CCR4的和为ARR

注意,此模式计数器的计数周期=ARR,这与PWM模式:计数周期 = ARR+1不同

这点参考下图STM32参考手册:




故,整理出代码以及计算公式如下:

void TIM3_PWMShiftInit(void)  
{  
    float Duty = 0;
    u16 ARR = 0,PSC = 0,CH3Ccr = 0,CH4Ccr = 0,DT = 0;
    u32 Frequence = 0;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;  
    GPIO_InitTypeDef  GPIO_InitStruct;  
    TIM_OCInitTypeDef TIM_OCInitStruct;
	
    Frequence = 125000;  //频率,单位:Hz
    Duty = 0.5;          //占空比
    DT = 1000;           //死区时间,单位:ns
	
    //中央对齐模式,只在CNT计数到CCR翻转一次,频率较PWM模式减半,且ARR不需要-1
    ARR = 36000000/(PSC+1)/Frequence;           //设置成125KHz
    CH3Ccr = ARR*Duty - DT/2/((PSC+1)*13.89f);  //TIM 72M下约13.89ns一个周期
    CH4Ccr = ARR - CH3Ccr;                      //CH4与CH3和为ARR

    /**********************TIM3 GPIO配置*****************************/  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
      
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  
  
    GPIO_Init(GPIOB,&GPIO_InitStruct);    
      
    /**********************初始化TimBase结构体*************************/  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 	
      
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  
    TIM_TimeBaseInitStruct.TIM_CounterMode   = TIM_CounterMode_CenterAligned1;  
    TIM_TimeBaseInitStruct.TIM_Period    = ARR;         
    TIM_TimeBaseInitStruct.TIM_Prescaler = PSC;       
      
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);  
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);  
    /**********************初始化TIM3 OC结构体*************************/  
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;  
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;  
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;  
    TIM_OCInitStruct.TIM_Pulse = CH3Ccr;            
		
    TIM_OC3Init(TIM3,&TIM_OCInitStruct);                                                       
    TIM_OCInitStruct.TIM_Pulse = CH4Ccr;  
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC4Init(TIM3,&TIM_OCInitStruct);  
		
    TIM_Cmd(TIM3, ENABLE);
}  


示波器波形如下:




程序中设定,频率=125K,占空比50%,死区时间1000ns,示波器出来波形与此相符。

改为频率=125K,占空比25%,死区时间500ns,波形如下图:





125K下25%占空比高电平持续时间应该为2us,减去死区0.5us = 1.5us,

上图可看到高电平持续时间约为1.5us,符合程序设定。

125kHZ低频读卡器功能概述: 本资源中包含读卡器原理图及PCB文件、读卡器源程序和电脑端上位机源程序。读卡器可以直接制作使用,可以使用附件中的上位机与读卡器进行通信,控制读卡器对T5557类卡片进行读写操作。对T5557卡片的配置必须为(RF/32,曼侧斯特编码),这也是国内T5557卡的常用配置。要对其他配置的T5557卡片或其他低频卡片(EM4305类和EMID卡片)进行读写,硬件上是支持的,只需根据卡片文档修改读卡器源程序,下载更新便可。为方便程序更新,硬件电路上已经实现自动下载,使用串口下载程序时无需手动设置BOOT0和BOOT1。 应用场景: 低频RFID主要用在短距离、低成本的应用中,如门禁控制、校园卡、煤气表、水表等。 在相关领域的开发中,可以使用该读卡器作为前台管理的设备,对客户卡进行管理。也可以将读卡器改成终端设备,如RFID门锁上的读卡器,用来验证卡片信息并控制门锁;或煤气表、水表上的读卡器,根据卡片内的余量信息控制煤气和水的供应。另外,也可以作为学习曼彻斯特解码的学习工具。 设计思路: 使用STM32F103R8T6输出125kHZ的PWM信号作为载波信号,将信号输入到功率放大电路,在线圈上产生125kHZ的正弦信号。T5557卡片从125kHZ信号中获取能量和控制命令,并根据命令将要传回的信息使用曼彻斯特编码对载波信号进行调制。读卡器端的检波电路和滤波放大电路将被调制信号提取处理成单片机能识别的数字信号,输入到STM32F103R8T6的输入捕获功能引脚,再通过STM32F103R8T6将捕获的信号进行曼彻斯特解码,最后将解码信息根据自己设定的通讯协议进行数据打包,发送到电脑上位机。 系统框图: 硬件平台: 1.主控制器:STM32F103R8T6 2.USB转TTL:CH340G 3.模拟电路:LM358 AMS1117-3.3V 125kHZ谐振线圈(345UH线圈搭配4700PF电容)谐振频率在线计算工具 4.蜂鸣器: 3V供电 软件平台: 开发工具:Keil uVision5 上位机编写工具:Microsoft Visual C# 学习版 成本估算: 芯片询价和在线购买链接https://www.bom2buy.com/元器件估算价格约为30元 项目进度: 1.能对AT5557/55567/5577卡片(配置为RF/32,曼彻斯特编码)进行整页读,密码读和密码写操作; 2.有相应的上位机,方便读写指令的发送和数据解读; 3.上位机与读卡器之间通讯加入了数据校验,提高了通讯的可靠性。 未来更新: 1.加入EM4305类和EMID卡片的读写功能; 2.加上触摸显示屏和电池,做成便携版 3.做成袖珍版,加入与手机通讯的接口(OTG或蓝牙)
STM32F1系列微控制器具有多个定时器,包括高级定时器(TIM1和TIM8),通用定时器(TIM2~TIM5),基本定时器(TIM6和TIM7),看门狗定时器和系统滴答定时器(Systick)。其中,高级定时器的时钟由APB1产生,通用定时器的时钟由APB2产生。这些定时器可以用于定时中断、PWM输出或输入捕获等应用场景。 在使用STM32F1定时器时,需要配置相关寄存器,如TIMx_ARR(自动重装载寄存器)、TIMx_PSC(预分频寄存器)、TIMx_CR1/2(控制寄存器1/2)、TIMx_CNT(16位自动装载计数器)、TIMx_CCMR1/2(捕获/比较模式寄存器1/2)、TIMx_CCER(捕获/比较使能寄存器)、TIMx_CCR1~4(捕获/比较寄存器1~4)、TIMx_BDTR(刹车和死区寄存器)等。 如果需要使用定时器进行延时操作,可以通过调用相关函数来实现。例如,使用CubeMX配置定时器后,需要在代码中调用HAL_TIM_Base_Start函数来启动定时器。同时,可以编写一个延时函数,通过读取定时器计数器的值来实现微秒级的延时。 请注意,以上是关于STM32F1定时器的一般介绍,具体的使用方法和配置可能会因具体的应用场景和需求而有所不同。 #### 引用[.reference_title] - *1* *3* [STM32F1定时器(TIM1~TIM8)](https://blog.csdn.net/weixin_39270987/article/details/130727485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32F1定时器基础知识](https://blog.csdn.net/SammySum/article/details/92229423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值