高级会员

- 积分
- 822
- 金钱
- 822
- 注册时间
- 2020-7-21
- 在线时间
- 85 小时
|
1金钱
板子:STM32F103RCT6
目的:在TIM3的通道3和4、TIM5的通道1和2、高级定时器TIM8的通道1234输出PWM波
要用到的引脚:经alldatasheet查询,
- /************************************************************************************
- 电机编号 PWM
- -------------------------------------------------------------------------------------
- 1 | PB0-TIM3CH3 PB1-TIM3CH4 |
- | |
- 2 | PA0-TIM5CH1 PA1-TIM5CH2 |
- | |
- 3 | PC6-TIM8CH1 PC7-TIM8CH2 |
- | |
- 4 | PC8-TIM8CH3 PC9-TIM8CH4 |
- -------------------------------------------------------------------------------------
- ************************************************************************************/
复制代码
具体过程:
首先放一个能成功同时在TIM3的两个通道的代码
- void TIM3_PWM_Init(u16 arr, u16 psc) //PWM 用TIM3CH3、TIM3CH4
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
- //设置该引脚为复用输出功能,输出TIM3 CH3/4的PWM脉冲波形 GPIOB0/1
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //TIM_CH3/4
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
- //初始化TIM3
- TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
-
- //初始化TIM3 Channel3 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
- TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR3上的预装载寄存器
- //初始化TIM3 Channel PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC4
- TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR4上的预装载寄存器
-
- TIM_Cmd(TIM3, ENABLE); //使能TIM3
-
- }
复制代码 经仿真和示波器接入测试,该PWM输出能正常使用。之后,我又尝试把其他的初始化也揉在一起。
- void TIM_PWM_Init(u16 arr, u16 psc) //PWM 用TIM3CH3、TIM3CH4
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCStructInit(&TIM_OCInitStructure);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3
- |RCC_APB1Periph_TIM5, ENABLE); //使能定时器3/5/8时钟
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
- |RCC_APB2Periph_GPIOA
- |RCC_APB2Periph_GPIOC
- |RCC_APB2Periph_TIM8
- |RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
- //设置该引脚为复用输出功能,输出TIM3 CH3/4的PWM脉冲波形 GPIOB0/1
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //TIM3_CH3/4
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //TIM5_CH1/2
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6
- | GPIO_Pin_7
- | GPIO_Pin_8
- | GPIO_Pin_9; //TIM8_CH1/2/3/4
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO
- //初始化TIM3
- TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
- TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
- TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //初始化TIM3 Channel3 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:低电平有效
- TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
- TIM_OC3Init(TIM8, &TIM_OCInitStructure);
- TIM_OC2Init(TIM5, &TIM_OCInitStructure);
- TIM_OC2Init(TIM8, &TIM_OCInitStructure);
- TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
- TIM_OC1Init(TIM8, &TIM_OCInitStructure);
- TIM_OC1Init(TIM5, &TIM_OCInitStructure);
- TIM_OC4Init(TIM8, &TIM_OCInitStructure);
-
- TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR3上的预装载寄存器
- TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
- TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
- TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);
- TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
- TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
- TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM3在CCR4上的预装载寄存器
- TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
- TIM_CtrlPWMOutputs(TIM8, ENABLE);
- TIM_Cmd(TIM3, ENABLE); //使能TIM3
- TIM_Cmd(TIM5, ENABLE);
- TIM_Cmd(TIM8, ENABLE);
复制代码 并在主函数补上了CCRx
- TIM_SetCompare3(TIM3, 200);
- TIM_SetCompare4(TIM3, 200);
- TIM_SetCompare1(TIM5, 200);
- TIM_SetCompare2(TIM5, 200);
- TIM_SetCompare1(TIM8, 200);
- TIM_SetCompare2(TIM8, 200);
- TIM_SetCompare3(TIM8, 200);
- TIM_SetCompare4(TIM8, 200);
复制代码
结果没有成功,于是我尝试去看原子哥的视频,发现对于多路PWM和高级定时器的讲解很少,于是我尝试借助网络,学习到两个点:
①要输出多路PWM应该加第五行TIM_OCStructInit(&TIM_OCInitStructure);这个函数(第五行),
②对于高级定时器输出PWM波,要加TIM_CtrlPWMOutputs(TIM8, ENABLE);这个函数(倒数第四行)。
通过仿真,我们发现,只有TIM3的通道3、通道4能正常输出PWM波,其他路都不能输出,均为低电平。而在示波器接入测试中,所有定时器通道不能输出任何PWM波
附仿真图片(图片中的第三路为PA1)
初步猜测可能是初始化函数步骤混乱,卡了一天没有解决,希望有配置经验的大佬指点一二。
|
-
|