搜索

gd32f303高级定时器实现SVPWM

[复制链接]
307|4
 楼主 | 2020-8-25 22:02 | 显示全部楼层 |阅读模式
本帖最后由 zeshoufx 于 2020-8-25 22:13 编辑

一、硬件
基于GD32303C-EVAL 开发板
timer0的pwm输出,PE8-PE13

二、svpwm
空间矢量脉宽调制(SVPWM)技术在电机驱动、变频技术等领域得到了广泛运用,
由于其直流侧电压利用率高且输出谐波含量低的优点,受到了开发人员的青睐。


三、MATLAB仿真

615805f45185a65e15.png 783685f451864e8ad3.png

四、程序
  1. /*
  2.     昆明电器科学研究所 张恩寿 2019年5月3日
  3.         
  4.         
  5. */
  6. #include "bitband.h"
  7. #include "led_config.h"
  8. #include "key_lookup.h"
  9. #include "systick.h"
  10. #include "usart.h"
  11. #include"arm_math.h"
  12. #include<math.h>

  13. void GPIO_config(void);
  14. void TIM_config(void);
  15. void DAC_config(void);
  16. void bound_check(float *var);
  17. uint8_t sec_idn(float angle);
  18. void tim_cal(void);

  19. timer_parameter_struct  TIM_TimeBaseStructure;
  20. timer_oc_parameter_struct  TIM_OCInitStructure;
  21. timer_break_parameter_struct TIM_BDTRInitStructure;

  22. float PWM_F= 5000; // <- chang for PWM_F
  23. float T_svm;
  24. float theta1=0,theta2=120,theta3=240,Va,Vb,Vc,Val,Vbe,spc_angle,spc_mag; //<-- angle and signal declaration
  25. float MI=1.0f;
  26. float clock=120000000;
  27. float ARR_val;
  28. uint8_t sig_flag=0,sector;
  29. float T1,T2,T0,T1n,T2n,T0n;
  30. float32_t CMP1, CMP2, CMP3;
复制代码
  1. void GPIO_config()
  2. {
  3.         rcu_periph_clock_enable(RCU_GPIOE);
  4.         rcu_periph_clock_enable(RCU_AF);
  5.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  6.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  7.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  8.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  9.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  10.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  11.         gpio_init(GPIOE,GPIO_MODE_AF_PP,GPIO_OSPEED_MAX,GPIO_PIN_8);
  12.         
  13.         gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP,ENABLE);
  14.         
  15. }
复制代码
  1. void TIM_config()
  2. {
  3.         rcu_periph_clock_enable(RCU_TIMER0);
  4.         rcu_periph_clock_enable(RCU_TIMER2);
  5.         
  6.         
  7.         TIM_TimeBaseStructure.period = (uint16_t)ARR_val-1;
  8.         TIM_TimeBaseStructure.prescaler = 0;
  9.          TIM_TimeBaseStructure.clockdivision=TIMER_CKDIV_DIV1;
  10.         TIM_TimeBaseStructure.alignedmode = TIMER_COUNTER_EDGE;
  11.         TIM_TimeBaseStructure.counterdirection=TIMER_COUNTER_UP;
  12.         timer_init(TIMER0, &TIM_TimeBaseStructure);
  13.         timer_enable(TIMER0);
  14.         
  15.          TIM_OCInitStructure.outputstate = TIMER_CCX_ENABLE;
  16.         TIM_OCInitStructure.outputnstate = TIMER_CCXN_ENABLE;
  17.         TIM_OCInitStructure.ocpolarity = TIMER_OC_POLARITY_HIGH;
  18.         TIM_OCInitStructure.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
  19.         
  20.         timer_channel_output_config(TIMER0,TIMER_CH_0,&TIM_OCInitStructure);
  21.         timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);
  22.         timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,T1);
  23.                
  24.         timer_channel_output_config(TIMER0,TIMER_CH_1,&TIM_OCInitStructure);
  25.         timer_channel_output_mode_config(TIMER0,TIMER_CH_1,TIMER_OC_MODE_PWM0);
  26.         timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,T2);
  27.                
  28.         timer_channel_output_config(TIMER0,TIMER_CH_2,&TIM_OCInitStructure);
  29.         timer_channel_output_mode_config(TIMER0,TIMER_CH_2,TIMER_OC_MODE_PWM0);
  30.         timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,T0);
  31.                
  32. //        TIM_CtrlPWMOutputs(TIM1, ENABLE);
  33. //        TIM1->BDTR  = 0xFF99;

  34.         
  35.         TIM_BDTRInitStructure.breakpolarity=TIMER_BREAK_POLARITY_LOW;
  36.         TIM_BDTRInitStructure.breakstate=TIMER_BREAK_DISABLE;
  37.         TIM_BDTRInitStructure.deadtime=50;
  38.         TIM_BDTRInitStructure.ideloffstate=TIMER_IOS_STATE_ENABLE;
  39.         TIM_BDTRInitStructure.outputautostate=TIMER_OUTAUTO_ENABLE;
  40.         TIM_BDTRInitStructure.protectmode=TIMER_CCHP_PROT_OFF;
  41.         TIM_BDTRInitStructure.runoffstate=TIMER_ROS_STATE_ENABLE;
  42.         
  43.         timer_break_config(TIMER0,&TIM_BDTRInitStructure);
  44.         
  45.         timer_primary_output_config(TIMER0,ENABLE);
  46.         
  47.         timer_auto_reload_shadow_enable(TIMER0);
  48.         

  49.         TIM_TimeBaseStructure.period =4665;
  50.         TIM_TimeBaseStructure.prescaler = 0;
  51.         TIM_TimeBaseStructure.clockdivision=TIMER_CKDIV_DIV1;
  52.         TIM_TimeBaseStructure.counterdirection=TIMER_COUNTER_UP;
  53.         timer_init(TIMER2, &TIM_TimeBaseStructure);
  54.         timer_interrupt_enable(TIMER2,TIMER_INT_UP);
  55.         timer_enable(TIMER2);
  56.         
  57.         nvic_irq_enable(TIMER2_IRQn,3,2);

  58. }
复制代码
  1. void DAC_config()
  2. {
  3.         rcu_periph_clock_enable(RCU_GPIOA);
  4.         rcu_periph_clock_enable(RCU_DAC);
  5.         
  6.         gpio_init(GPIOA,GPIO_MODE_AIN,GPIO_OSPEED_MAX,GPIO_PIN_4|GPIO_PIN_5);
  7.         
  8.         dac_wave_bit_width_config(DAC0,DAC_WAVE_BIT_WIDTH_12);
  9.         dac_wave_bit_width_config(DAC1,DAC_WAVE_BIT_WIDTH_12);
  10.         dac_wave_mode_config(DAC0,DAC_WAVE_DISABLE);
  11.         dac_wave_mode_config(DAC1,DAC_WAVE_DISABLE);
  12.         dac_trigger_disable(DAC0);
  13.         dac_trigger_disable(DAC1);
  14.         dac_output_buffer_enable(DAC0);
  15.         dac_output_buffer_enable(DAC1);
  16.         dac_enable(DAC0);
  17.         dac_enable(DAC1);
  18.                
  19. }
复制代码
  1. void TIMER2_IRQHandler(void)
  2. {
  3.         if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))
  4.         {
  5.                 sig_flag =1;
  6.                 timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);
  7.         }
  8.                
  9. }
  10. void bound_check(float *var)
  11. {
  12.         if(*var ==360)
  13.         {
  14.                 *var = 0;
  15.         }
  16. }
  17. uint8_t sec_idn(float angle)
  18. {
  19.         uint8_t sec_sig;
  20.         sec_sig = (angle/60 )+ 1;
  21.         if(sec_sig == 7)
  22.         {
  23.                 sec_sig =6;
  24.         }
  25.         return sec_sig;
  26. }
  27. void tim_cal(void)
  28. {
  29.         uint8_t ac_f =0;
  30.         T1 = sqrt(3)*T_svm*spc_mag*sinf((sector*PI/3)-spc_angle);
  31.         T2 = sqrt(3)*T_svm*spc_mag*sinf(spc_angle-(sector-1)*PI/3);
  32.         T0 = T_svm -T1 -T2;
  33. }
复制代码



五、结果


PWM输出波形

PWM输出波形

电压信号(马鞍形)

电压信号(马鞍形)

SVPWM的原理讲解.pdf

946.28 KB, 下载次数: 10

使用特权

评论回复
| 2020-8-29 16:39 | 显示全部楼层
学习学习。

使用特权

评论回复
| 2020-9-1 18:03 | 显示全部楼层
楼主威武!

使用特权

评论回复
 楼主 | 2020-9-2 09:21 | 显示全部楼层

大家一起交流,,,

使用特权

评论回复
 楼主 | 2020-9-2 09:22 | 显示全部楼层

大家一起交流,,,

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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