野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 205|回复: 1

关于TM1输出PWM的问题

[复制链接]
发表于 2024-3-4 17:50:47 | 显示全部楼层 |阅读模式
TIM1通过CH1/CHIN输出互补PWM已经实现;

现在问题是:TIM1还能在CH4输出一个不互补的PWM吗?我初始化了GPIO-PA11以及输出比较通道CH4,结果PA8/PB13的互补PWM波形都没了

我的代码如下:


#include "pwm.h"

void BUCK_PWM_Init(void)//BUCK电路输出互补PWM波形(PA8、PB13)
{   
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能PORTA,B时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        //初始化GPIO,PA8       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//端口复用
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
        GPIO_Init(GPIOA,&GPIO_InitStructure);//PA11
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
        GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
        //初始化时基单元
        TIM_DeInit(TIM1);
        TIM_TimeBaseInitStruct.TIM_ClockDivision=1;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period=1799;
        TIM_TimeBaseInitStruct.TIM_Prescaler=0;
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
        //将输出通道1初始化为PWM模式1
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
        TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
        TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
        TIM_OCInitStruct.TIM_Pulse=1000;
        TIM_OC1Init(TIM1,&TIM_OCInitStruct);
        //输出通道4初始化为PWM模式1
        TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Disable ;
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
        TIM_OCInitStruct.TIM_Pulse=500;
        TIM_OC4Init(TIM1,&TIM_OCInitStruct);
        //使能预装载寄存器
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
        //死区和刹车功能配置
        TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Disable;
        TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Disable;
        TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;
        TIM_BDTRInitStruct.TIM_DeadTime=216; //
        TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
        TIM_BDTRInitStruct.TIM_Break=TIM_Break_Disable;
        TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
        TIM_BDTRConfig(TIM1,&TIM_BDTRInitStruct);
        //使能自动重装载
        TIM_ARRPreloadConfig(TIM1,ENABLE);
        //开启定时器
        TIM_Cmd(TIM1,ENABLE);
        //主输出使能
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
}




回复

使用道具 举报

 楼主| 发表于 2024-3-5 10:33:20 | 显示全部楼层
已解决,代码如下:

  1. #include "bsp_GeneralTim.h"


  2. void GENERAL_TIM_Mode_Config(void)
  3. {
  4.         /*--------------------GPIO初始化-------------------------*/
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.     // 输出比较通道1、4的 GPIO 初始化
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;   //PA11
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  12.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  13.         GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
  14.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
  15.         GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
  16.                
  17.        
  18.     // 开启定时器时钟
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  20.   /*--------------------时基结构体初始化-------------------------*/
  21.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  22.         TIM_TimeBaseStructure.TIM_Period=1799;          //40K HZ
  23.         TIM_TimeBaseStructure.TIM_Prescaler= 0;          //72M
  24.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        //1分频       
  25.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  26.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
  27.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  28.         /*--------------------输出比较结构体初始化-------------------*/               
  29.         //将输出通道1、4初始化为PWM模式1
  30.         TIM_OCInitTypeDef  TIM_OCInitStruct;
  31.         TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
  32.         TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
  33.         TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable ;
  34.         TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
  35.         TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
  36.         TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
  37.         TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
  38.         TIM_OCInitStruct.TIM_Pulse=1000;
  39.         TIM_OC4Init(TIM1,&TIM_OCInitStruct);
  40.         TIM_OC1Init(TIM1,&TIM_OCInitStruct);
  41.        
  42.         //使能预装载寄存器
  43.         TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
  44.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
  45.         //死区和刹车功能配置       
  46.         TIM_BDTRInitTypeDef  TIM_BDTRInitStruct;
  47.         TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Disable;
  48.         TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Disable;
  49.         TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;
  50.         TIM_BDTRInitStruct.TIM_DeadTime=216; //
  51.         TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
  52.         TIM_BDTRInitStruct.TIM_Break=TIM_Break_Disable;
  53.         TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
  54.         TIM_BDTRConfig(TIM1,&TIM_BDTRInitStruct);
  55.         //使能自动重装载
  56.         TIM_ARRPreloadConfig(TIM1,ENABLE);
  57.         //开启定时器
  58.         TIM_Cmd(TIM1,ENABLE);
  59.         //主输出使能
  60.         TIM_CtrlPWMOutputs(TIM1,ENABLE);
  61. }


  62. void PWM_Pause(void)
  63. {
  64.         TIM_SetCompare1(TIM1, 1500);
  65.         TIM_SetCompare4(TIM1,500);
  66. }




  67. /*********************************************END OF FILE**********************/
复制代码

初始化CH4的GPIO后,输出比较结构体不用改动,加两句TIM_OC4Init(TIM1,&TIM_OCInitStruct);
TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);即可
互补PWM和单独一路PWM的占空比通过TIM_SetCompare1(TIM1, 1500);TIM_SetCompare4(TIM1,500);
单独配置即可。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 14:35 , Processed in 0.132236 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表