[STM32F1]

STM32与SVPWM的应用

[复制链接]
楼主: wangjiahao88
手机看帖
扫描二维码
随时随地手机跟帖
wangjiahao88|  楼主 | 2019-7-15 12:49 | 显示全部楼层
522205d2c05ec713d0.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:50 | 显示全部楼层
708545d2c05f91bbdf.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:51 | 显示全部楼层
    本系统采用ADI公司的ADUM3223作为MOS驱动器。该芯片内部采用磁隔离
的方式,省去了外部隔离光藕,大大减少了设计面积。每个芯片提供两路独立的隔离
通道,正好可以驱动一对MOS管。除此之外,该芯片具有以下特点[27]:
    1) 4A峰值输出电流;
    2)最高1 MHz的操作频率;
    3 > 3.3V到SV的CMOS输入逻辑;
    4) 4.5V到18V的输出驱动。

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:51 | 显示全部楼层
824265d2c06591e67e.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:52 | 显示全部楼层
    永磁同步电机控制系统必须能实时的检测出电机转子当前的位置才能进行相应
的坐标转换,对电机完成解藕。通过位置信息还可以得到电机的速度信息,用来做控
制系统的速度环,以达到调速的目的。因此,永磁同步电机的位置反馈是整个控制器
的必须环节。
    本系统的位置反馈使用的是装在永磁同步电机转子轴上的400线的增量式光电
编码器,为Agilent的HEDM系列光电旋转编码器[[33]。该编码器为SV供电。其形状
及引脚定义如图3-10所示。
484825d2c06748bcf2.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:52 | 显示全部楼层
665115d2c06818ee65.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:52 | 显示全部楼层
90005d2c069d51060.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:53 | 显示全部楼层
729735d2c06bcb9717.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:53 | 显示全部楼层
    为了能保证控制系统的实时运行,要求控制器可以尽快的产生新的调制波形,两
次调制时间的间隔时间越短,则控制的实时性越好。但调制频率过快则会导致芯片计
算速度跟不上,因此要在考虑芯片运算速度的同时,选择合适的调制频率,一般工程
上设为20KHz。为了保证系统能准时进行调制计算,则把整个调制过程放在了
SVPWM产生的中断子程序中。在中断子程序中,由于对时间的限制,我们只在其中
重新对产生电压矢量的方向进行了计算,并没有把PID部分的计算放在里面。其流程
如图4-3所示。
933145d2c06d81f9e7.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:54 | 显示全部楼层
    根据控制系统的硬件设计可知,位置反馈是由光电编码器检测得到,而速度则可
以通过位置信息得到。STM32F103VET6在硬件上提供了编码器接口,以方便设计人
员直接得到编码器数据。其设置方法如下:
TIM_ TimeBaseStructure.TIM_ Period=crp一1;
TIM_ TimeBaseStructure.TIM_ Prescaler=0x0;
TIM_ TimeBaseStructure.TIM_ C1ockDivision=TIM_ CKD_ DIV 1;
        TIM_ TimeBaseStructure.TIM_ CounterMode=TIM_ CounterMode_Up;
        TIM_ TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
        TIM_ EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_
Rising, TIM_ ICPolarity一ising);
        TIM_ ICInitStructure.TIM_ Channel=TIM_ Channel_ 1;
        TIM_ ICInitStructure.TIM_ ICPolarity=TIM_ ICPolarity_Rising;
TIM ICInitStructure.TIM ICSelection=
TIM ICInitStructure.TIM ICPrescaler=
TIM_ ICSelection_DirectTI;
TIM一CPSC_ DIV1;
        TIM_ ICInitStructure.TIM_ ICFilter=0x00;
    由于光电编码器的输入信号为两路相互正交的方波信号,只要将定时器上设置为
编码器模式,并设置为上下边沿都触发的模式就可以将编码器的精度变为原来的四
倍。其过程如图4-4所示。
52355d2c06fad3ac2.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:54 | 显示全部楼层
195415d2c0709bdec5.png 581675d2c0714d0ae8.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:55 | 显示全部楼层
10905d2c07444c438.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:55 | 显示全部楼层
752705d2c07529e62a.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:56 | 显示全部楼层
    本系统使用采样电阻的检测方式,经过AD8207差分放大器放大、偏置,送入
STM32F103VET6内部12位ADC进行采样。采样时间点的选取对系统有很大的影响,
STM32的强大功能使我们将ADC的采样时刻与定时器TIM 1关联起来,这样可以结
合输出SVPWM调制波的状态来决定ADC的采样时刻。
    设置STM32内部的ADC的EXTTRIG控制位可以将触发模式变为由外部事件触
发,使用的是TIM1_ CC4事件触发,转换模式为注入转换。配置方式如下:
ADC_ ExternalTrigInjectedConvConfig(ADCI,ADC_ ExternalTrigInjecConv_T1_ CC
4)
ADC_ ExternalTrigInjectedConvCmd(ADC1, ENABLE);
触发时刻由图4-5所示。
464165d2c07731af57.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:56 | 显示全部楼层
    因此,我们可以通过设置定时器TIM 1通道4的值来触发ADC的注入转换时间,
方便了设计人员使用。该动作由硬件自动完成,不需要占用任何软件资源,降低了软
件的复杂度,提高了系统的可靠性及响应速度。
    在采样时,必须确保三相桥式电路的低端是导通的。为了更好的重建电流模型,
当我们在采样时就不能选择低端关闭或者导通时间短的那一相。因此要求我们要选择
导通时间长的两相电流,然后计算出另外一相的电流。通过在不同扇区的导通波形可
矢口:
    1>在1, 6扇区时,选择B, C两相作为采样通道。
    2)在2, 3扇区时,选择A, C两相作为采样通道。
    3)在4, 5扇区时,选择A, B两相作为采样通道。

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:57 | 显示全部楼层
    电机作为一个机械部件,其响应速度不可能跟电子器件相比,因此根本没有必要
将PID计算放到svPwM中断子程序中。因此可以将其放到其他定时器中断中去,
这样不仅可以减少svPwM中断子程序的代码,而且能够通过调节定时器中断的频
率来改变PID的计算频率,具有很高的灵活性。定义PID的结构体为:
    struct pid_q15_s{
        int A[3];
        int kp;
        int ki;
        int kd;
        int x[2];
        int y;
};
初始化PID函数:
void pid_q15_ init(struct pid_q15_s *ppid)
{
ppid->A[0]=ppid->kp+ppid->ki+ppid->kd;
ppid->A[ 1]=-ppid->kp一(2*ppid->kd);
ppid->A[2]=ppid->kd;
ppid->x[0]=0;
ppid->x[ 1]=0;
ppid->y=0;
}
根据PID原理[[38]可知,PID的计算函数:
int pid_q15(struct pid_q15_s *ppid, int x)
{
      ppid->y=ppid->y+ppid->A[0]*x+ppid->A[ 1]*ppid->x[ 1]+ppid->A[2]*
ppid->x[0];
ppid->x[0]=ppid->x[1];
ppid->x[ 1]=x;
return ppid->y;
由上面的程序我们就可以分别对速度、交轴电流、直轴电流进行PID运算。

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:57 | 显示全部楼层
185555d2c07bb060df.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:57 | 显示全部楼层
42555d2c07c6388f0.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:58 | 显示全部楼层
8165d2c07d936969.png

使用特权

评论回复
wangjiahao88|  楼主 | 2019-7-15 12:58 | 显示全部楼层
561645d2c07e751da8.png

使用特权

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

本版积分规则