[STM32F1] 求高手指点,怎么用STM32F103做三相全控桥移相触发PWM脉冲

[复制链接]
5948|16
 楼主| 言月生 发表于 2016-9-20 09:14 | 显示全部楼层 |阅读模式
我手上有别人做的一个样机,他是用STM32F103V做的,我测了它输出的波形,如下图,依次是+A,+B,+C,-A,-B,-C, a.bmp b.bmp c.bmp

-A

-A

-B

-B

-C

-C

图中的CH2是UAB,根据波形可以看出,它用的双脉冲触发,每个脉冲里有载有10KHZ的高频信号,硬件上他只用了一路同步信号,同步信号是UAB,接到STM32的PB9脚,这六路信号接到STM32的PE8到PE13,根据手册,PB9是TIM4CH4,PE8到PE13是TIM1CH1(N)-CH3(N),

请问有了解这方面的没,我想问, 他是用一个定时器TIM1既做移相定时,又做脉宽定时,又做10K载波的吗?要怎么配置寄存器?我看到例程里面大多都是用于逆变控制,产生互补的脉冲,不适用整流
mmuuss586 发表于 2016-9-20 10:13 | 显示全部楼层
你可以用2个定时器配合使用;
一个触发另外一个
 楼主| 言月生 发表于 2016-9-20 11:11 | 显示全部楼层
mmuuss586 发表于 2016-9-20 10:13
你可以用2个定时器配合使用;
一个触发另外一个

谢谢,能讲讲吗,两个定时器,怎么实现移相定时,脉宽定时,和脉冲中有有10KHZ高频脉冲 整流双窄触发脉冲.png
crystal1987 发表于 2016-9-20 14:14 | 显示全部楼层
本帖最后由 crystal1987 于 2016-9-20 14:23 编辑

对于移相和脉宽定制,这个应该比较好实现;比如在定时中断2中输出一个IO口高电平,然后定时(移相)触发中断3在,中断3中再输出一个IO口高电平;再根据定时时间让IO口输出低电平。
比如:TIM2一直开中断  中断时间3600代表3.6S;TIM3定时中断也是3600个计数,代表3.6S  两个信号的脉宽一个是1S;第二个是500ms;移相30°
先在TIM2中断输出PB0 = 1;定时300ms后开启TM3中断;然后在TM3中断中输出输出PB1 = 1;

 楼主| 言月生 发表于 2016-9-20 14:32 | 显示全部楼层
crystal1987 发表于 2016-9-20 14:14
对于移相和脉宽定制,这个应该比较好实现;比如在定时中断2中输出一个IO口高电平,然后定时(移相)触发 ...

谢谢,同步信号是取自交流电,不是由内部定时器定时产生,频率范围在50HZ左右,对应就是20MS左右,这要做个测频功能,根据测得的频率得到周期对应0-360度,在这20毫秒内要依次输出6路脉冲信号
Mozarts 发表于 2016-9-20 16:38 | 显示全部楼层
每个脉冲里有载有10KHZ的高频信号,硬件上他只用了一路同步信号啊
zhouhuanの 发表于 2016-9-20 17:00 | 显示全部楼层
用的双脉冲触发的波形啊,应该问题不大才是
CallReceiver 发表于 2016-9-20 17:23 | 显示全部楼层
言月生 发表于 2016-9-20 14:32
谢谢,同步信号是取自交流电,不是由内部定时器定时产生,频率范围在50HZ左右,对应就是20MS左右,这要做 ...

同步信号是UAB,接到STM32的PB9脚
 楼主| 言月生 发表于 2016-9-20 23:24 | 显示全部楼层
zhouhuanの 发表于 2016-9-20 17:00
用的双脉冲触发的波形啊,应该问题不大才是

是双脉冲,但是每个脉冲还要载10KZ
cyj1232 发表于 2016-9-21 09:30 来自手机 | 显示全部楼层
请问10khz的载波起什么作用?
 楼主| 言月生 发表于 2016-9-21 10:47 | 显示全部楼层
cyj1232 发表于 2016-9-21 09:30
请问10khz的载波起什么作用?

这个脉冲是给脉冲变压器,脉冲变压器驱动晶闸管,我也不知道他为什么要用载波,但我用示波器测的确实是有10KHZ
cyj1232 发表于 2016-9-22 15:19 | 显示全部楼层
我分析载波应该是用在脉冲脉冲变压器耦合使用的,可以减小脉冲变压器的体积,用光耦或其他方式耦合应该不需要载波
zhuotuzi 发表于 2016-9-22 16:30 | 显示全部楼层
这么高级的东西,真没研究过,学习一下,楼主弄出来分享分享。
wm0478 发表于 2016-9-23 17:46 来自手机 | 显示全部楼层
直流电机的整流控制,仿西门子的双脉冲可控硅触发方式,建议单片单独出一路10k的pwm,然后用与非门和pwm输出给脉变驱动电路。一个Tim为主,根据过零和移相给定中断触发(用其他定时器中断配合)使能输出的序列。
 楼主| 言月生 发表于 2016-9-28 14:23 | 显示全部楼层
楼上说得很对,我手上有一个市场上成熟产品的板子,我想把它的程序充掉,我重新写程序功能与它一样,下下去,它的板子没有外加与非门载波。

这几天我研究了很多STM32定时器的示例程序,感觉这个基础上改可行

void RCC_Configuration(void)
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
}
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin =        GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode                =        GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed    =        GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}
vu16 CCR1_Val=8000;
vu16 CCR2_Val=4000;
vu16 CCR3_Val=2000;
vu16 CCR4_Val=1000;
void TIM_Configuration(void)
{
        //结构体
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        //写成员
        TIM_TimeBaseStructure.TIM_Period=65535;                        //ARR
        TIM_TimeBaseStructure.TIM_Prescaler=0;                                //预分频先设0
        TIM_TimeBaseStructure.TIM_ClockDivision=0;                        //捕获专用参数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向 上TIM_CounterMode
        //写完初始化                                                                                                                                                       
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//设置Base
        TIM_PrescalerConfig(TIM2,7199,TIM_PSCReloadMode_Immediate);//预分频再设为7199且立即装入
        //72M/7200=0.01M=10khz -> 0.1ms
       
        //比较捕获寄存器写成员
        //TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;                        ////TIM输出比较时间模式
        TIM_OCInitStructure.TIM_OCMode=        TIM_OCMode_Toggle;             //TIM输出比较触发模式
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //out使能
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;        //TIM输出比较极性高       
       
        TIM_OCInitStructure.TIM_Pulse=CCR1_Val;                                //待装入捕获比较寄存器的脉冲值。
        TIM_OC1Init(TIM2,&TIM_OCInitStructure);//OC1    0.1ms*8000=0.8s
        TIM_OCInitStructure.TIM_Pulse=CCR2_Val;                                //待装入捕获比较寄存器的脉冲值。
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);//OC2    0.1ms*4000=0.4s
        TIM_OCInitStructure.TIM_Pulse=CCR3_Val;                                //待装入捕获比较寄存器的脉冲值。
        TIM_OC3Init(TIM2,&TIM_OCInitStructure);//OC3    0.1ms*2000=0.2s
        TIM_OCInitStructure.TIM_Pulse=CCR4_Val;                                //待装入捕获比较寄存器的脉冲值。
        TIM_OC4Init(TIM2,&TIM_OCInitStructure);//OC4    0.1ms*1000=0.1s
        //禁止预装载寄存器
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);//TIM_OCPreload_Disable
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);//TIM_OCPreload_Disable
        TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);//TIM_OCPreload_Disable
        TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);//TIM_OCPreload_Disable
        //使能中断
        TIM_ITConfig(TIM2,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);
        TIM_Cmd(TIM2,ENABLE);
       
}



图片1.png
这是仿真结果,
最下面可以档当于载波,倒数第二相当于移相,中断中处理PWM输出

 楼主| 言月生 发表于 2016-9-28 14:24 | 显示全部楼层
还只是初步想法,试试看能行不,有结果了告诉大家
fqingy2008 发表于 2021-1-15 19:20 | 显示全部楼层
您好,请问他是输出PE9-14外部有其他逻辑电路吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部