# STM32 使用IQmath实现SVPWM

24 篇文章 364 订阅 ¥39.90 ¥99.00
30 篇文章 73 订阅

## SVPWM

SVPWM是空间矢量脉宽调制(Space Vector Pulse Width Modulation)的简称，通常由三相逆变器的六个功率开关管组成，经过特定的时序和换相所所产生的脉冲宽度调制波，最终输出的波形可能会十分接近理想的正弦波形。

## IQMATH

TI的片子很香，控制方面，TI无疑是做的最好的方案之一，相对来说资料也非常齐全；

IDE：MDK-ARM

## 测试部分程序

/**
#include "stm32f10x.h"
#include <stdio.h>
#include <stdint.h>

#include "serial_scope.h"
#include "common.h"
#include "IQmathLib.h"
#include "usart_driver.h"
#include "clarke.h"
#include "park.h"
#include "svpwm.h"

/**
* @brief  Main program.
* @param  None
* @retval None
*/
sv_mod_t svpwm = SVGEN_DEFAULTS;

#define CLARK		0
#define PARK		1
#define SVPWM		2
#define SVPWM_REG	3

int main(void)
{
int user_data[4] = { 0 };
static int16_t time_cnt = 0;
Trig_Components a;
Trig_Components b;
_iq final_angle;
usart_init();

while (1)
{
time_cnt-=32;

clarke_parameter.As = _IQsinPU(time_cnt);
clarke_parameter.Bs = _IQsinPU(time_cnt-0x5555);

if(clarke_parameter.As > 32767){
clarke_parameter.As = 32767;
}
if(clarke_parameter.As < -32768){
clarke_parameter.As = -32768;
}

if(clarke_parameter.Bs > 32767){
clarke_parameter.Bs = 32767;
}
if(clarke_parameter.Bs < -32768){
clarke_parameter.Bs = -32768;
}

clarke_calc(&clarke_parameter);

park_parameter.Alpha = clarke_parameter.Alpha;
park_parameter.Beta = clarke_parameter.Beta;

park_parameter.Sin = trig_functions(time_cnt).hsin;
park_parameter.Cos = trig_functions(time_cnt).hcos;
park_parameter.Angle = -time_cnt;
park_calc(&park_parameter);

svpwm.Ualpha = clarke_parameter.Alpha;
svpwm.Ubeta = clarke_parameter.Beta;

svpwm_calc(&svpwm);

#define FOC_DEBUG 	SVPWM_REG
#if	(FOC_DEBUG == CLEAK)
user_data[0] = clarke_parameter.As;
user_data[1] = clarke_parameter.Bs;
user_data[2] = clarke_parameter.Alpha;
user_data[3] = clarke_parameter.Beta;
#elif (FOC_DEBUG == PARK)
user_data[0] = clarke_parameter.As;
user_data[1] = clarke_parameter.Bs;
user_data[2] = park_parameter.Ds;
user_data[3] = park_parameter.Qs;
#elif (FOC_DEBUG == SVPWM)
user_data[0] = (uint16_t)svpwm.Ta;
user_data[1] = (uint16_t)svpwm.Tb;
user_data[2] = (uint16_t)svpwm.Tc;
user_data[3] = svpwm.VecSector*5000;
#elif (FOC_DEBUG == SVPWM_REG)

//换算的CCRx寄存器的值
sv_regs_mod_t sv_regs = svpwm_get_regs_mod(7200,&svpwm);

user_data[0] = sv_regs.ccr1;
user_data[1] = sv_regs.ccr2;
user_data[2] = sv_regs.ccr3;
user_data[3] = svpwm.VecSector*1000;
#endif
SDS_OutPut_Data_INT(user_data);
}
return 0;
}



## 附件

07-28 8640
01-22 1554
03-26 3万+
12-22
03-13
02-19 2508
07-28 7107
01-18
09-10
12-12 4975
11-10

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。