实验12 单相太阳能并网逆变器SPWM发生器设计 了解SPWM的应用领域,掌握单相并网逆变器SPWM发生器的设计方法。

代码讲解

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"    vu16 freq = 5000, Period = 0;
__IO float Period_percent;int main(void)
{          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         delay_init();       LED_Init();         TIM8_PWM_Init(5000,0);    TIM2_Int_Init(5000,0);      uart_init(115200);Period_percent = ((SystemCoreClock / freq) - 1) / 32767.0;        while(1)            {         LED0=!LED0;         delay_ms(300);                     }
}

TIM8_PWM_Init(5000,0);
TIM2_Int_Init(5000,0);

此时的5000已经不再是溢出周期了,而是频率,我们对TIM8_PWM_Init go to definition

void TIM8_PWM_Init(u16 pfreq ,u16 psc)
{             . . . . . .        TimerPeriod = (SystemCoreClock / pfreq) - 1;         . . . . . .      TIM_TimeBaseStructure.TIM_Period = TimerPeriod;         . . . . . .
}

我们发现,5000赋给了形参pfreq,根据公式(SystemCoreClock / pfreq) - 1计算得到TimerPeriod=14399,最后才把TimerPeriod赋给TIM_Period。但是72MHz/ (arr+1)/(psc+1)=5000Hz,不是50Hz,为什么要错100倍?
答:交流电是50Hz,周期是0.02s,我们把这50Hz又分成100份,我们另这100份里面的占空比按照正弦的规律来变化。

之后便是PWM输出的设置,选用PWM模式1:TIM_OCMode_PWM1,输出状态为正常TIM_OutputState_Enable和互补TIM_OutputNState_Enable,输出极性为TIM_OCPolarity_High,互补输出极性为TIM_OCNPolarity_High,空闲时输出状态为TIM_OCIdleState_Set,空闲时互补输出状态为TIM_OCNIdleState_ Reset。

  TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;                   TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;          TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;         TIM_OCInitStructure.TIM_Pulse        = Channel1Pulse;                     TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;           TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;              TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;            TIM_OC1Init(TIM8, &TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;                   TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;          TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;         TIM_OCInitStructure.TIM_Pulse        = Channel2Pulse;                    TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;              TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;           TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;               TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;            TIM_OC2Init(TIM8, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);//预装载使能                        TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);

最后是只有高级定时器才有的配置,死区时间,刹车,刹车极性等等。死区是为了防止两路都有输出,导致爆炸,所以要特意留一部分时间两路都不输出。

  TIM_BDTRInitStructure.TIM_OSSRState       = TIM_OSSRState_Enable;//运行时  TIM_BDTRInitStructure.TIM_OSSIState       = TIM_OSSIState_Enable;//空闲时  TIM_BDTRInitStructure.TIM_LOCKLevel       = TIM_LOCKLevel_1;  TIM_BDTRInitStructure.TIM_DeadTime        = 0x2F; //2F                    TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Disable;  TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;  TIM_BDTRConfig(TIM8, &TIM_BDTRInitStructure);  //高级定时器设置,只有TIM1和TIM8才有的  TIM_Cmd(TIM8, ENABLE);                                               TIM_CtrlPWMOutputs(TIM8,ENABLE);

然后回到main函数,对TIM2_Int_Init go to definition

void TIM2_Int_Init(u16 ifreq,u16 psc)
{              . . . . . .      TimerPeriod = (SystemCoreClock / ifreq) - 1;                                                          TIM_TimeBaseStructure.TIM_Period = TimerPeriod;      . . . . . .
}

5000赋给了形参ifreq,根据公式(SystemCoreClock / ifreq) - 1计算得到TimerPeriod=14399,最后才把TimerPeriod赋给TIM_Period。这也是与常规的TIM2_Int_Init函数唯一的不同。

TIM2_IRQHandler

void TIM2_IRQHandler(void)
{        extern float Period_percent;        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)                         {                  TIM_SetCompare1(TIM8,(u16)(Period_percent*spwm[i])) ;           TIM_SetCompare2(TIM8,(u16)(Period_percent*spwm[i++]));           if(i == 101)  //一个周期要溢出100次            {                i = 0;            }            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);          }
}

由标红的两句话可知,每进一次中断,更改一次占空比,达到输出SPWM波的目的。

由函数TIM_SetCompare1(TIM8,(u16)(Period_percentspwm[i]))看出,比较点是Period_percentspwm[i],我们先对spwm go to definition

const u32 spwm[100] = {
0x4000,0x4405,0x4805,0x4BFE,0x4FEA,0x53C7,0x578F,0x5B40,0x5ED5,0x624A,
0x659E,0x68CB,0x6BCF,0x6EA7,0x714F,0x73C6,0x7609,0x7815,0x79E8,0x7B81,
0x7CDD,0x7DFC,0x7EDD,0x7F7E,0x7FDF,0x7FFF,0x7FDF,0x7F7E,0x7EDD,0x7DFC,
0x7CDD,0x7B81,0x79E8,0x7815,0x7609,0x73C6,0x714F,0x6EA7,0x6BCF,0x68CB,
0x659E,0x624A,0x5ED5,0x5B40,0x578F,0x53C7,0x4FEA,0x4BFE,0x4805,0x4405,
0x4000,0x3BFB,0x37FB,0x3402,0x3016,0x2C39,0x2871,0x24C0,0x212B,0x1DB6,
0x1A62,0x1735,0x1431,0x1159,0x0EB1,0x0C3A,0x09F7,0x07EB,0x0618,0x047F,
0x0323,0x0204,0x0123,0x0082,0x0021,0x0001,0x0021,0x0082,0x0123,0x0204,
0x0323,0x047F,0x0618,0x07EB,0x09F7,0x0C3A,0x0EB1,0x1159,0x1431,0x1735,
0x1A62,0x1DB6,0x212B,0x24C0,0x2871,0x2C39,0x3016,0x3402,0x37FB,0x3BFB,
};

由于正弦规律的计算比较麻烦,且每个周期分成了100份,我们用“sinewave”软件建了一个大小为100的数组spwm。

我们设置的精度位为15,即基数是32767,且一个周期内采样100个点,则spwm中标红的第25个点0x7FFF就是32767。

再对Period_percent go to definition

Period_percent = ((SystemCoreClock / freq) - 1) / 32767.0;

因为在TIM8_PWM_Init中设置了TimerPeriod = (SystemCoreClock / pfreq) - 1,即设置了TIM8是从0到14399计数的,但是比较点spwm的大小在0-32767之间,所以要把spwm转换成0-14399之间的数,因此要设置一个百分比变量:Period_percent = ((SystemCoreClock / freq) - 1) / 32767.0 = 14399 / 32767。

编译仿真

注:由于MDK的仿真对TIM8的仿真支持不太好,把TIM8_PWM_Init改成TIM1_PWM_Init,才能仿真出效果。

打开仿真

点击示波器


弹出如下示波器页面:

点击set up增加变量

点击左边的方框,添加TIM1的通道1,通道2及其互补通道所对应的引脚PORTA.8,PORTA.9,PORTB.13,PORTB.14,同时把Display Type改为Bit。



点击运行

运行结果:可以见到4路通道都输出了SPWM波。

遇到的错误

MDK仿真没有产生SPWM波形。

解决:将TIM8输出PWM波的任务给TIM1

STM32微控制器综合实训12 单相并网逆变器SPWM发生器相关推荐

  1. STM32微控制器综合实训11 伺服电机控制器设计实验

    实验11 伺服电机控制器设计实验 了解伺服电机的应用领域,掌握伺服电机的速度控制模式.伺服电机的位置控制模式. 文章目录 程序设计 伺服电机的速度控制模式代码讲解 main.c timer.c 伺服电 ...

  2. Bootstrap4+MySQL前后端综合实训-Day10-AM【实训汇报-下午返校、项目代码(7个包+7个Html页面)】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 实训汇报 数据库--所有SQL语句 工程文件展示 代码 ①package ...

  3. 机电一体化综合实训考核装置

    ZN-01MES机电一体化综合实训考核装置 一.概述 ZN-01MES机电一体化综合实训考核装置 是一种为典型的机电一体化.自动化类产品,ZN-01MES机电一体化综合实训考核装置是为职业院校.教育培 ...

  4. 机电一体化综合实训考核设备

    ZN-IGZ06机电一体化综合实训考核设备 一.概述 ZN-IGZ06机电一体化综合实训考核设备由颗粒上料工作站.加盖拧盖工作站.检测分拣工作站.工业机器人包装工作站.成品自动入库工作站组成,包括了智 ...

  5. 计算机控制电梯如需改变功能 则,电梯维修项目教程 教学课件 作者 孙文涛附加答案试卷综合实训三模拟试题(13).doc...

    PAGE 5 深圳高级技工学校2011-2012学年第二学期 <电梯综合实训三>理论模拟试题(13) : 号 学 : 级 班 : 名 姓 ┄ ┄ ┄ ┄一一 ┄ ┄┄ ┄┄┄ 线 此 过 ...

  6. Bootstrap4+MySQL前后端综合实训-Day08-PM【ajax获取表单标签内容、根据“栏目信息”添加“新闻信息”、新闻管理系统-项目展示】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目   录 ajax获取表单标签内容 ajax根据数据库加载select下来列 ...

  7. Bootstrap4+MySQL前后端综合实训-Day07-AM【ajax局部刷新——(单个/批量)删除用户按钮的实现、更新用户信息按钮的实现】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目   录 (单个/批量)删除用户按钮的实现.更新用户信息按钮的实现--展示 ...

  8. 电子技术综合实训考核装置

    ZN-790JSD电子技术综合实训考核装置 一.概述 ZN-790JSD电子技术综合实训考核装置是我公司根据教育部"振兴21世纪职业教育课程改革和教材建设规划"的要求,按照职业教育 ...

  9. 计算机网络实训室建设设备,计算机网络技术综合实训室建设方案--200万.doc

    计算机网络技术综合实训室建设方案--200万.doc 计算机网络技术综合实训室建设方案一.计算机网络技术综合实训室涉及的专业及学生数计算机网络技术综合实训室主要用于电子信息系计算机网络技术及其他相关专 ...

最新文章

  1. Python计算医疗数据训练集、测试集的对应的临床特征:训练集(测试集)的阴性和阳性的样本个数、连续变量的均值(标准差)以及训练测试集阳性阴性的p值、离散变量的分类统计、比率、训练测试集阳性阴性的p值
  2. Windows Azure Storage – 4万亿对象和计数
  3. 2020必知的 10 大顶级 python 库
  4. 成功解决Exception unhandled AttributeError 'MainWindow' object has no attribute 'setDaemon'
  5. Just another board game 博弈-vector套vector
  6. 【机器学习基础】深入讨论机器学习 8 大回归模型的基本原理以及差异!
  7. applet实现大文件ftp上传(三)
  8. mysql数据库下载压缩包_mysql 8.0.22 zip压缩包版(免安装)下载、安装配置步骤详解...
  9. 为什么openstack要用rabbitmq这类消息中间件来进行RPC这类的操作呢,直接rpc不行吗?
  10. Java 导出 Excel 文件
  11. 当代年轻人加班报告!
  12. 为什么新技术产品经常出问题,以及如何在您的公司中防止它
  13. java和vue的狱警管理系统监狱系统狱务管理系统
  14. xmlspy xsd生成java_XmlSpy / XSD 以及 验证
  15. 第十三周项目2(1)
  16. githup用户名密码怎么看_水星无线路由器的密码忘了如何解决【解决方法】
  17. 数据结构之leetcode 347题
  18. mysql局域网访问6_mysql局域网访问
  19. 2018计算机二级html,2020年全国计算机二级Web程序设计考试大纲(2018年版)
  20. 武林外传之同福奇缘 【安卓游戏】

热门文章

  1. RecurDyn学习1
  2. 科技风PPT汇报模板
  3. 电商裂变新玩法—全新拼团!
  4. Orbit Downloader 1.5.4多国语言版
  5. HTTP安全与HTTPS协议
  6. LyNews『凌云新闻』 - 在JAVA文件中获取该项目的相对路径
  7. 【Mac】加快Magic Mouse的移动速度
  8. 让一维数组像糖果盒一样简单
  9. 赛迪智库:政务数据不愿共享的成因及对策
  10. 全球及中国汽车取力器(PTO)行业销售策略及供需前景预测报告2022-2027