STM32高级定时器TIM1和TIM8的单脉冲模式都实现不了吗?

2019-07-14 18:25发布

最近在做一个项目,用到了交流电机,控制方式是检测交流电的过零点,延时一定时间,然后输出脉冲驱动双向晶闸管驱动电机,延时的长短可以控制晶闸管的导通角,从而控制了电机的转速。这个方案可以用定时器的普通方法实现,即过零检测触发外部中断,启动定时器延时,时间到后开通晶闸管。但这种方式需要软件频繁地中断处理,虽然10ms对STM32已经是非常长的时间了。但我还是想用纯硬件的方式解决,经过网友的提示,可以用STM32的单脉冲模式,如使用tiM3的CH2接外部过零信号,用CH1输出脉冲驱动晶闸管。经过实验,此方案可行,CH2模拟了100HZ(交流电一个周期2次过零)的过零信号,然后用逻辑分析仪检测到了CH1输出的准确信号,通过调整单脉冲的过零后延时,控制脉冲宽度,从而达到控制晶闸管导通角调速电机。
但因为项目几乎用光了STM32的定时器,硬件上要求用TIM8来实现这个功能,就像平时换定时器一样,我只把TIM3改为TIM8,但结果发现这样不行,而且IO,时钟等都改过来了,还是不行,逻辑分析仪就是检测不到脉冲输出,弄了几天了,希望朋友们能指点迷津……。
主要代码如下:
/*=================================================================  
* 功能: 定时器单脉冲模式IO配置
* 参数:  
* 返回:   
* 日期:   
*================================================================*/

void TIM8_OnePulse_GpioConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;


/* TIM8_CH1 pin (PC.6) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* TIM8_CH2 pin (PC.7) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*=================================================================  
* 功能: 配置定时器为单脉冲模式
* 参数:  
* 返回:   
* 日期:   
*================================================================*/
void STM32_TIM8_OnePulse_Config(void)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_ICInitTypeDef  TIM_ICInitStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);  // TIM8 clock enable  

TIM8_OnePulse_GpioConfig( );

/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 8000;  //8ms
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

/* TIM8 PWM2 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 6000;               //过零后的延时时间 6ms
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);

//TIM_ICStructInit(&TIM_ICInitStructure); /* TIM8 configuration in Input Capture Mode */

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM8, &TIM_ICInitStructure);

TIM_SelectOnePulseMode(TIM8, TIM_OPMode_Single);/* One Pulse Mode selection */
TIM_SelectInputTrigger(TIM8, TIM_TS_TI2FP2);/* Input Trigger selection */
TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Trigger);/* Slave Mode selection: Trigger Mode */
}
TIM8这个定时器是可以工作的,我试过了定时,PWM输入模式,PWM输出模式都没问题的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
TOPCB
1楼-- · 2019-07-14 22:16
程序后面加上下面代码试试。
/* TIM8 counter enable */
  TIM8_Cmd(ENABLE);
csshan3
2楼-- · 2019-07-15 03:16
加了也不行,因为我用其他定时器不用加都可以的,可能不是这个问题……
freesea123
3楼-- · 2019-07-15 06:24
1、你确定下TIM8的功能,STM32的几个定时器的功能都不是一样的,有些功能比较多,有些功能比较特殊。配置好像也是不一样的。
2、按道理来说,你的软件应该没有什么问题。
csshan3
4楼-- · 2019-07-15 07:38
我看了手册上高级定时器和通用定时器的单脉冲模式几乎是一样设置的,但就是不知道高级定时器还要另外设置哪些……
freesea123
5楼-- · 2019-07-15 11:18
 精彩回答 2  元偷偷看……
Dipper123323
6楼-- · 2019-07-15 11:54
我在输入捕获的时候也遇到了这个问题,其他通用定时器都可以,但是切换到高级定时器了就不行了,看来真的得自习研究下高级定时器了

一周热门 更多>