打印
[STM32F1]

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

[复制链接]
5194|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我手上有别人做的一个样机,他是用STM32F103V做的,我测了它输出的波形,如下图,依次是+A,+B,+C,-A,-B,-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高频脉冲

使用特权

评论回复
地板
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;

使用特权

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

谢谢,同步信号是取自交流电,不是由内部定时器定时产生,频率范围在50HZ左右,对应就是20MS左右,这要做个测频功能,根据测得的频率得到周期对应0-360度,在这20毫秒内要依次输出6路脉冲信号

使用特权

评论回复
6
Mozarts| | 2016-9-20 16:38 | 只看该作者
每个脉冲里有载有10KHZ的高频信号,硬件上他只用了一路同步信号啊

使用特权

评论回复
7
zhouhuanの| | 2016-9-20 17:00 | 只看该作者
用的双脉冲触发的波形啊,应该问题不大才是

使用特权

评论回复
8
CallReceiver| | 2016-9-20 17:23 | 只看该作者
言月生 发表于 2016-9-20 14:32
谢谢,同步信号是取自交流电,不是由内部定时器定时产生,频率范围在50HZ左右,对应就是20MS左右,这要做 ...

同步信号是UAB,接到STM32的PB9脚

使用特权

评论回复
9
言月生|  楼主 | 2016-9-20 23:24 | 只看该作者
zhouhuanの 发表于 2016-9-20 17:00
用的双脉冲触发的波形啊,应该问题不大才是

是双脉冲,但是每个脉冲还要载10KZ

使用特权

评论回复
10
cyj1232| | 2016-9-21 09:30 | 只看该作者
请问10khz的载波起什么作用?

使用特权

评论回复
11
言月生|  楼主 | 2016-9-21 10:47 | 只看该作者
cyj1232 发表于 2016-9-21 09:30
请问10khz的载波起什么作用?

这个脉冲是给脉冲变压器,脉冲变压器驱动晶闸管,我也不知道他为什么要用载波,但我用示波器测的确实是有10KHZ

使用特权

评论回复
12
cyj1232| | 2016-9-22 15:19 | 只看该作者
我分析载波应该是用在脉冲脉冲变压器耦合使用的,可以减小脉冲变压器的体积,用光耦或其他方式耦合应该不需要载波

使用特权

评论回复
13
zhuotuzi| | 2016-9-22 16:30 | 只看该作者
这么高级的东西,真没研究过,学习一下,楼主弄出来分享分享。

使用特权

评论回复
14
wm0478| | 2016-9-23 17:46 | 只看该作者
直流电机的整流控制,仿西门子的双脉冲可控硅触发方式,建议单片单独出一路10k的pwm,然后用与非门和pwm输出给脉变驱动电路。一个Tim为主,根据过零和移相给定中断触发(用其他定时器中断配合)使能输出的序列。

使用特权

评论回复
15
言月生|  楼主 | 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);
       
}



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

使用特权

评论回复
16
言月生|  楼主 | 2016-9-28 14:24 | 只看该作者
还只是初步想法,试试看能行不,有结果了告诉大家

使用特权

评论回复
17
fqingy2008| | 2021-1-15 19:20 | 只看该作者
您好,请问他是输出PE9-14外部有其他逻辑电路吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝