找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2510|回复: 3
收起左侧

STM32 TIM3的全映射的通道三pwm波形输出不对

[复制链接]
ID:483399 发表于 2019-7-29 22:55 | 显示全部楼层 |阅读模式
用32单片机的TIM3的全映射的通道三(PC8)和通道四(PC9)输出两路PWM波,程序如下,为什么用keil中的模拟只有PC8有PWM波形,PC9无呢,这是为什么?time.C
  1. void TIM3_CH3_PWM_Init(u16 arr,u16 psc)     //通道3的初始化
  2. {  
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6.         

  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  8.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  9.         
  10.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  11.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOC.8
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH3
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
  16.         

  17.    //初始化TIM3
  18.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  19.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  20.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  21.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  22.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  23.         
  24.         //初始化TIM3 Channel2 PWM模式         
  25.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  26.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  27.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  28.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC3
  29.         TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
  30.         
  31.   TIM_CtrlPWMOutputs(TIM3,ENABLE);
  32.   TIM_ARRPreloadConfig(TIM3, ENABLE);        
  33.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  34.         

  35. }


  36. void TIM3_CH4_PWM_Init(u16 arr,u16 psc)    //通道4的初始化
  37. {  
  38.         GPIO_InitTypeDef GPIO_InitStructure;
  39.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  40.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  41.         

  42.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  43.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  44.         
  45.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  46.         
  47. //        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  48.          //设置该引脚为复用输出功能,输出TIM3 CH3的PWM脉冲波形        GPIOC.9
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH4
  50.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  51.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  52.         GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO

  53.    //初始化TIM3
  54.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  55.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  56.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  57.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  58.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  59.         
  60.         
  61.         //初始化TIM3 Channel2 PWM模式         
  62.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  63.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  64.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  65.         TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4
  66.         TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);


  67.   TIM_CtrlPWMOutputs(TIM3,ENABLE);
  68.   TIM_ARRPreloadConfig(TIM3, ENABLE);
  69.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3

  70. }
复制代码
部分主函数

  1. int main(void)
  2. {        
  3. u8 m1,m2;
  4. u8 sumHD;        
  5. delay_init();        //延时函数初始化        
  6. LED_Init();        //初始化与LED连接的硬件接口
  7. H_D_Init();
  8. TIM3_CH3_PWM_Init(899,71);
  9. TIM3_CH4_PWM_Init(899,71);
  10. while(1)
  11. {
  12. }
复制代码

11.png

回复

使用道具 举报

ID:123289 发表于 2019-7-30 08:02 | 显示全部楼层
查一下手册,看看PWM允许从哪些端口输出。
回复

使用道具 举报

ID:511461 发表于 2019-7-30 09:14 | 显示全部楼层
复用并不是外设引脚随便配置,而指的是一个引脚有多个外设公用,但是任何一个时刻只能有一个外设使用它。你是不是还有别的地方用到了
回复

使用道具 举报

ID:511461 发表于 2019-7-30 09:36 | 显示全部楼层
楼主,你的波怎么出来的,你没有设置这两路的占空比吧
我用了你的代码,并在while中加了两句       
TIM_SetCompare3(TIM3,270);
TIM_SetCompare4(TIM3,270);
用示波器看过了两路都有波。
要不你再while中也加上这两句,如果PC9还没波,而且你还没有在别的地方用过这个引脚,那就是你的这个引脚坏了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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