void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/********* PA 6 7 ******************************/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用
GPIOA6_Out=1; GPIOA7_Out=1;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//TIM3_CH2,TIM3_CH3
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Timer_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM2->CR1 &= 0xfffe;
TIM3->CR1 &= 0xfffe;
///PWM,输出的引脚是 TIM3_CH2
TIM_TimeBaseStructure.TIM_Period = 60000;
TIM_TimeBaseStructure.TIM_Prescaler = 11; //72/12=6
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //翻转模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能比较匹配输出极性
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置比较匹配输出极性
TIM_OCInitStructure.TIM_Pulse = 30000; //比较值
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //
TIM_OC2PreloadConfig(TIM3 , TIM_OCPreload_Enable); //使能 比较预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能预装载寄存器
TIM3->CR1 &= 0x3fe; // 失能 TIM 计数器
TIM3->CR2 = 0x60; // MMS[2:0] = 110 oc2匹配上发出触发信号
/////////////// TIM2 /////
TIM_TimeBaseStructure.TIM_Period = 100;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);
TIM2->SMCR = 0x0000; //禁用从模式的情况进行从模式配置
TIM2->SMCR |= 0x020; // TS[2:0]=010 TIM2触发源选择:TIM3的TRGI
TIM2->SMCR |= 0x007; // 使能从模式SMS[2:0]=111 使用内部触发 TRGI 即外部时钟1模式
TIM2->CNT = 0x00;
TIM3->CNT = 0x00;
TIM2->SR = 0x00;
TIM3->SR = 0x00;
TIM2->EGR =0x00;
TIM3->EGR =0x00;
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE); //使能TIM2 更新中断
TIM_ITConfig(TIM3, TIM_IT_Update,DISABLE); //失能TIM3 更新中断
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE); //DISABLE ENABLE
}
我的疑惑是 PWM输出脚TIM3_CH2 有方波出来却无法驱动后端光耦发脉冲。
但是TIM3_CH2,用做普通I/O功能的时候却可以自己编一段仿PWM输出来驱动光耦发脉冲。
我怀疑:一:PWM输出的驱动能力没有普通IO的强。
二:我的PWM输出配置有问题,请各位大大帮我看一下我的配置代码。
没用过这个,你简单的加个上拉看看能不能驱动后端光耦
PWM引脚本身就是复用的IO口,驱动能力应该是一样的;
当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑);
工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
PWM引脚本身就是复用的IO口,驱动能力应该是一样的;
当光耦导通时,让PWM引脚灌入电流,这个电流足以让光耦导通(不要怀疑);
工业控制的恶劣环境中,更常规的做法是PWM端外接驱动器来驱动光耦。
但是现在我又遇到问题了。
我用的STM32的TIM3的PWM发脉冲,TIM2对脉冲数进行计数,计数到达设定个数时,在TIM2的中断服务函数中失能TIM3。
但是实际情况会是发的脉冲数量比我设置的数量要多1个。 不管怎么怎么改变设定个数都是会多一个脉冲。