完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做一个项目,用到了交流电机,控制方式是检测交流电的过零点,延时一定时间,然后输出脉冲驱动双向晶闸管驱动电机,延时的长短可以控制晶闸管的导通角,从而控制了电机的转速。这个方案可以用定时器的普通方法实现,即过零检测触发外部中断,启动定时器延时,时间到后开通晶闸管。但这种方式需要软件频繁地中断处理,虽然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输出模式都没问题的 |
|
相关推荐
11个回答
|
|
麻烦香水帮我看看好吗,项目比较急,谢谢啦!
|
|
|
|
|
|
|
|
加了也不行,因为我用其他定时器不用加都可以的,可能不是这个问题……
|
|
|
|
1、你确定下TIM8的功能,STM32的几个定时器的功能都不是一样的,有些功能比较多,有些功能比较特殊。配置好像也是不一样的。
2、按道理来说,你的软件应该没有什么问题。 |
|
|
|
我看了手册上高级定时器和通用定时器的单脉冲模式几乎是一样设置的,但就是不知道高级定时器还要另外设置哪些……
|
|
|
|
1、建议你还是仔细看看定时器的区别,我能够确定的是,STM32的几个定时器的功能上是不一样的。而且我还记得,他们的时钟源也是不一样的。
2、要看英文版的,英文版的比较详细。 |
|
|
|
我在输入捕获的时候也遇到了这个问题,其他通用定时器都可以,但是切换到高级定时器了就不行了,看来真的得自习研究下高级定时器了
|
|
|
|
我刚刚调试了TIM8通道4的输出比较Toggle模式。也是在普通定时器上没问题,改成TIM8就没有输出。后来发现,1是启动代码中没有添加TIM8的四个中断入口;2是在TIM8配置代码中要加入TIM_CtrlPWMOutputs(TIM8, ENABLE)。这样一改就可以实现比较输出功能了
|
|
|
|
|
|
|
|
楼主解决没?我也遇到了,TIM8无脉冲输出,但TIM1有的 |
|
|
|
这个怎么解决的,我也遇到;额
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2105 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1941 浏览 3 评论
4537 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2084 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:01 , Processed in 0.930141 second(s), Total 92, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号