毕业设计(论文)-基于STM32单片机SPWM单相逆变电源设计_第1页
毕业设计(论文)-基于STM32单片机SPWM单相逆变电源设计_第2页
毕业设计(论文)-基于STM32单片机SPWM单相逆变电源设计_第3页
毕业设计(论文)-基于STM32单片机SPWM单相逆变电源设计_第4页
毕业设计(论文)-基于STM32单片机SPWM单相逆变电源设计_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目:基于STM32单片机SPWM单相逆变电源设计 第一章 绪论1.1课题的研究背景及意义新世纪以来,人们越发注重对环境的保护,所以都致力于减少化石能源的采集改而研究各种新能源。在这样的社会背景下,对新能源进行高效开发利用就成为了新世纪的科技发展方向。相较于不能够再生的石油、天然气和煤,可再生能源和太阳能这些新能源更加的绿色低碳环保,能源主体的变换带来的是发电方式的变革,相应的由新能源所生产的电能并入电网,需要的就是逆变技术。如今这项技术更多地融入了日常的生产生活。逆变通俗来说把直流电转变为交流电的进程,方便解决了一些能源发电所出现的直流与交流不通的问题,而这种完成逆变过程的电路叫做逆变电路。

2、逆变电源则早就诞生在1960年代,随着新理论、新技术、新工艺的不断出现,以及和微电子技术的日益结合,逆变电源具有了高可靠性、高稳定性、占用空间小和功耗低的优势,所以随着科技的日新月异而发展壮大。1.2逆变电源的发展从二十世纪六十年代诞生以来,伴随着元器件的更新换代逆变电源技术也取得了长足的进步。以所用的电力电子开关器而言,作为一个功率半导体器件,对电能进行转换控制,实现电能的调节。逆变电源主要有如下三代发展:第一代逆变电源,由于时间较早科技所限,当时所使用元器件是晶闸管(SCR)。由于一开始技术不成熟所以其本身不能进行关闭,因而就加大了整体电路复杂程度、体积重量大、高噪声高污染以及效率低下的问

3、题,因而第一代的发展并未有多少成就。第二代逆变电源,随着元器件的发展,第二代使用上了全控器件,有些也是一代晶闸管的衍生产品,诸多的高速器件的应用,同时采用了SPWM控制技术,这就是第二代逆变电源的进步。同样的第二代也有着不足之处:(1)无法很好地匹配非线性负载的使用;(2)波形质量无法得到保证,不稳定;(3)无法实现良好的动作质量;(4)不能够被三相电所使用的。第三代逆变电源,是通过对第二代进行控制技术改进,取得实时的数据反馈达到控制目的,方法:1)反复多次进行控制;2)通过其他波形进行补偿以完善控制;3)通过无差拍方式进行控制;4)进行极短时间的一个电压值进行控制;5)组成双环反馈电路进行控

4、制。这些方式也或多或少地存在一些缺陷,但随着科技的发展,会有更好更完善的逆变电源技术得以实现。接下来的时间里科技不断完善也将带动着逆变电源技术不断发展,向着高效绿色进发,成为新能源电源的主力军。1.3本课题的目标与任务本课题参考着生产实践,结合国内外的文献研究成果,结合自身对于逆变电源技术和STM32的理解与使用,完成基于STM32单片机SPWM单相逆变电源的设计任务。第二章:首先介绍分析SPWM技术的原理方法,然后进行分析两种极性电源调制方案,最后根据需求确定本课题所需要的控制方案。第三章:逆变电源的硬件电路设计,主要包括:选取逆变电路结构,进行电源电路、数据和采集电路以及驱动电路等的设计分

5、析。第四章:逆变电源的软件程序设计,主要阐述STM32单片机开发环境,SPWM信号产生模块设计,控制算法等。第五章:对系统整体调试和对结果分析。第六章:得出课题结论,对问题进行总结指出不足与改进的方向逆变电源控制方案研究该控制系统由逆变电源采用,其功能是调节逆变电源参数或外部因素,使整个变频器过程完成电能的转换,并满足输出波形的要求。本文分析并比较了SPWM技术以及单极性和双极性PWM控制模式,并将最终选择了单极性SPWM。2.1 SPWM技术简介二十世纪六十年代由德国科学家使用脉宽调制即PWM(Pulse Width Modulation)技术改进逆变电源。随着多年的发展改进,衍生了自然采样

6、、按照一定规律采样、通过谐波进行补偿等调制方法,到如今PWM技术已经日益完善了,得以正确地使用。正弦脉宽调制也就是我们课题中提到的SPWM。这项技术产生于首先是在,通信领域得到的发展。SPWM的原理是在比较参考波和载波之后,能够得到一组所需的矩形波。而这些矩形波的振幅相同的情况下,所得的脉宽是由作为参考作用的波形的三大参数(相位、幅值、频率)所影响的。因此这些矩形脉冲就获得了如下的特点,其脉冲中点也就在相应的载波的中点的位置,同时还符合了面积等效原理。得到了图2-1。通俗地来说SPWM波,脉冲宽度是呈现着正弦波规则的变化趋势,而且受到系数所以影响发生相应改变,最直接的表现就是幅值变化。采用了这

7、种技术之后,系统将会有着如下这些主要优势:(1)对于输出波形的三大参数(频率、幅值、相位)能够同级调试;(2)输出波形峰值高低不受输入的功率相位差影响;(3)能同时调节输出波形频率幅值;图2-1 正弦调制矩形脉冲序列因为输出波形有正极性和负极性两种,所以对应着的调制方法也就有了单极性和双极性的两种。区别在于单极性只有正/负半轴,而双极性则兼具正负半轴为完整波形。2.2 SPWM单极性和双极性比较分析2.2.1 单极性正弦脉冲宽度调制图2-2所展示的为单相桥式逆变电路。定义感性负载电路中,四个T1, T2,T3,T4的开关动作执行控制,以:1)从正半周期输出波形开始,开口管T1,T2关闭管。它打

8、开时,管T4,电源电压等于负载电压Ud。此时T4闭合状态下,由于感性负载,在通过电源后负载的电流的不会突然变化导致被接通此时的二极管D3,负载电流将继续通过D3流动,负载电压下降到零。如果流过负载的大电流,较慢地衰减,这将导致D3通电直到T4再次导通,D3保持当前状态,以保护负载电压为零。如果在负载中的电流迅速衰减至0,D3关闭负载电压为0这一状态到重新打开T4之前保持。通过控制上述操作,输出电压可以交替地得到0和Ud输出。图2-2 单相桥式PWM逆变电路2)同样,在负的半个周期中,T2管开启,T1管关闭。控制T3管开关。开启T3管时,输出工作电压为-Ud;当T3管关闭时,使用一个二极管D4续

9、流,则输出的信号电压为0,输出电压U0进行在0和-Ud之间相互交替发展变化。通过分析上述风险控制管理模式,输出电流波形值具有Ud和0三种不同状况。如图2-3 T3或T4开关管的方法。具体而言,Uc是一个三角波载波,但它是调制波具有相同的极性,Ur是正弦波的调制信号,和中断控制T3和T4在两个波的交点。当调制波是正的,打开管Tl和Ur UC。当管T4导通时,负载电压U0 = Ud,当UrUc,T4管关闭,U0=0; 以相同的方式适当调制波Ur为负,则可以关闭T1管和打开T2管,当UrUc时打开T3管,负载电压U0=-Ud,当UrUc时,T3关闭,U0=0.此时就能得到所需的SPWM波形U0。图2

10、-3 单极性PWM控制原理图2.2.2 双极性正弦脉冲宽度调制 相比较于单极性正弦波脉宽调制,他们之间有所差异,而且双极性正弦波脉宽调制有着其独特之处,同样所显示出的波形也有别与单极性,如图2-4所示即为双极性控制的单相桥式逆变电路。图2-4双极性PWM控制原理图在调制正弦波Ur的半周期中,以双极SPWM控制方式,载波是一个正负变化的双极性三角波,所以输出的PWM波形也在正负转换。从调制的正弦波Ur的全周期开始,只有两个输出波形:+Ud和-Ud。在载波和调制波之间发展仍然需要选择进行关闭系统控制技术设备在交点。在调制波Ur的周期中,电路中的开关管的控制研究方法与单极控制管理方法以及基本情况相同

11、。这时,打开T4管和T1管,关闭T2管和T3管,这时我们得到PWM。波形幅值U0=Ud; Ur255)maxnum=255;接下来就由每个点对应的角度值来计算出对应的脉宽数据了:for(i=0;iCCR1 寄存器以及TIMx-CCR2寄存器(两者分属两路路PWM的寄存器),当CNT的计数值和TIMx-CCR1、TIMx-CCR2 相比较即会产生相应的极性电平。因此我们只需改变TIMx-CCR1、TIMx-CCR2的值大小即可改变PWM的脉宽。载波频率就是PWM输出的频率,而且这个频率是根据上面所给出的二个数据所决定:void TIM3_ PWM_ Init(uint16_ t period,

12、uint16_t prescaler);period:自动重装值。 prescaler:时钟预分频数。PWM频率=PWM系统时钟/(prescaler+1)/(period+1)=48000/(7+1)/(255+1)=23.4Khz注:PWM系统时钟为系统主时钟48Mhz。Period值为计数器最大值,即计数到此值后会清零。TIM_ SetCompare1(TIM3,pwmindex);TIM_ SetCompare2(TIM3,pwmindex);这两个函数分别是控制两路PWM脉宽变化的函数,其实际作用即是改变了TIMx-CCR1和TIMx-CCR2,所以可以改变PWM脉宽。综合以上,我们

13、得出PWM初始化函数如图4-8:图4-8 PWM输出程序4.5 按键功能程序设计系统所使用的四个按键分别起到调节输出频率及幅值,前面的程序已经将改变正弦波输出频率和幅值的程序设计好了,现在至于要改变其中输入的参数即可以改变对应输出:幅值调节程序图4-9:图4-9 幅值调节程序图中程序为幅值调节部分,通过按键可以改变VolTemp的值大小,然后只需将VolTemp的值更新到对应的getSinTab(50,VolTemp)函数中即可。频率调节程序图4-10:图4-10 频率调节程序图中程序为频率调节部分,通过按键可以改变PIvTemp的值大小,然后只要将PIvTemp更新到对应的getSinPlv

14、(PIvTemp)函数中即可。4.6 串口通信模块程序设计串口通信模块设计有串口控制输出频率和幅值功能,故需要将串口中断打开来接收收到的控制指令。采用9600的串口波特率,不需要校验,设置停止位1位,并且启用串口接收中断,另外需要配置相应的串口引脚,及串口时钟的开启。4.6.1串口配置初始化程序初始化串口对相应的参数进行设定,配置所需引脚。使能串口时钟,设定I/O为输入输出模式,设定波特率、数据位和奇偶校验等。定义的串口指令格式:第一字节:0 xaa第二字节:0 x01:控制频率0 x02:控制幅值第三字节:频率:0-200Hz 幅值:0-40V初始化程序如图4-11:图4-11 串口的初始化

15、程序4.6.2串口中断接收程序在单片机中进行串口数据的收发工作时,其自带的USART_DR寄存器就专门负责这个工作。然后在接收到数据后需要有程序进行中断操作,以方便之后的数据处理。程序如图4-12:RecFlag为接收到-组数据完成的标志符号。图4-12 串口中断接收程序4.6.3串口数据解析程序图4-13 串口数据解析程序串口接收到数据,对于所得的数据进行解析,然后控制串口控制,程序如图4-13。同样的,VolTemp和PIvTemp分别为幅值和频率调节值,只要更新到对应设置函数即可。即为上文按键程序所服务。4.7 OLED显示程序系统采用的是OLED显示屏进行显示。所显示的参数主要是:In

16、put(V):输入电压值。On或Off:输出状态指示。on为正常输出,off 代表输出过流保护,已关闭输出。Fr(Hz):输出频率值。此值为按键调节设置值。AC(V):输出正向峰值电压值。此值为按键所设置值。显示程序void Display()/显示输入电压OLED_Show Num(48,0,Voltage/100,1,16);OLED_Show Num(56,0,Voltage%100/10,1,16);OLED_Show Num(72,0,Voltage%10,1,16);/显示输出状态if(Short Flag=1)OLED_Show String(96,0,(uint8_ t*)Of

17、f,16);elseOLED_Show String(96,0,(uint8_ t* )On ,16);/显示输出频率OLED_Show Num(24,2,PIvTemp/100,1,16);OLED_Show Num(32,2,PlvTemp%100/10,1,16);OLED_Show Num(40,2,PlvTemp%10,1,16);/显示输出幅值OLED_ Show Num(104,2,VolTemp%100/10,1,16);OLED_Show Num(112,2,VolTemp%10,1,16); .液晶显示在系统中是1秒钟刷新显示一次,通过定时器计数变量来判断:图4-14 液晶

18、显示刷新4.8 采集输入电压、输出电流程序在本系统中通过STM32单片机内部的AD (12位)来检测输入的直流电压和输出的交流电流,输入电压的检测采用电阻分压(由于输入电压超过单片机自身供电电压,所以必须采用电阻分压形式),测得分压值后,按照电阻比例推算出输入电压值。在正弦波输出回路中串联一只0.1欧姆的功率电阻,电阻分压所得信号过小,经LM358运放放大后再由单片机AD检测即可。具有DMA功能的STM32F030 单片机,能够直接读取寄存器,这种读取方式极大减少内核工作量,使用起来非常方便,直接开辟一段存储区即可,只要读指定存储区的数据就可得到采集到的AD数据。那么利用DMA传输数据主要需要

19、设置以下几点:(1)开启DMA时钟。(有时钟才可以 工作)(2)确定外设地址。( 外设地址即ADC部件的地址)(3)指定内存地址。(指定DMA可以读取的内存区域,这样就可将此内存区域指向外设地址,即读取到的数据就是AD采集到的数据)(4)设置外设作为数据传输的来源。(5)存储数组大小。( 即开辟数组的其中包含几个数据)(6)数据宽度。( 数组中数据的宽度,此处设置为16位)(7)DMA通道使能。DMA初始化程序部分:图4-15图4-15 DAM初始化程序AD初始化需要设置以下几点:(1)精度设置。(我们设置为最高的12位精度)(2)规定模式转换工作在连续模式。即连续进行AD转换)(3)数据对齐

20、为右对齐。(数据右对齐即采集到的AD值最低位先存在寄存器的最低位)(4)ADC转换时间。(决定了一次AD转换使用多长时间)(5)ADC开始转换。AD初始化程序:图4-16图4-16 AD初始化程序对应采集AD值程序:图4-17图4-17 AD值采集程序从图中程序可以看到Filter ()是代表采集输入电压通道的AD值进行滤波的函数, Filter1()代表采集输入电流的AD通道采集到的AD值进行滤波的函数,看到函数中直接读取了RegularConvData_Tab0和RegularConvData_Tab1的值,这两个数据就分别是采集输入电压通道和输出电流AD采集通道所分配的数组对应的值。直接

21、读取即可,正是因为DMA数据传输的作用,不用单片机进行任何操作。经过了32次连续的AD采集,目的为进行数字滤波( 多次采集值之和求平均值),以确保电压数值的稳定,输入电压采集的公式推算在硬件部分已经介绍。if(Voltage-_voltage10)(_ voltage-Voltage10) , 这样一个判断的目的是当输入电压改变时,要相应的改变1V系数即Para,然后对输出做出更新即getSinTab(50,VolTemp);,目的是当输入电压改变时保持输出电压不变。输出电流采集进行了32次连续的AD采集,目的为进行数字滤波(多次采集值之和求平均值),以确保所得数值的稳定。电流值的计算在硬件设

22、计部分己介绍。程序如图4-18:图4-18 采集值更新程序4.9 过流保护程序过流保护即为保护功率器件L298来设置的,当单片机AD采集到的AD值达到过流值2A后,即关断输出,从而达到保护全桥的目的。过流保护后,我们设置了定时,过流后保护后,5秒之后,单片机会再次尝试打开输出,如果还是过流则立刻关闭输出进行保护。5秒后再次尝试打开,依次进行下去。图4-19为程序图4-19 过流保护程序从上图可以看到,过流值2A时对应的Ad值为993,ENA_CIr()即关闭输出使能。TimeCount是一个以1秒为基数的计数变量, TimeCount5即代表5秒时间到。TimeCount是在Timer14作为

23、定时器的定时中断服务函数中进行计时。Timer14计数器初始化配置如下图4-20:图4-20 Timer14计数器初始化程序将Timer14定时中断间配置为10ms,Timer14 定时时间= (100*4800) /48= 10ms。 Timer14定时中断服务函数:图4-21:图4-21 Timer14定时中断服务程序if(VolTemp!=_voltemp)| |(PIvTemp!=_plvtemp)TimeCount2+;这一句的判断作用:当检测到设置量VolTemp或PlvTemp发生改变时(由按键或串口设置的改变),TimeCount2在累加,如果此时还有按键按下那么TimeCou

24、nt2会在按键检测处被清零。其目的就是只有按键按下后2S内还没有按键操作时才会进行频率和幅值的更新:图4-22:图4-22 更新频率或幅值4.10 本章小结本章介绍了程序所用的开发环境Keil,系统整体程序设计,然后分模块细述了各模块的程序设计,包括SPWM信号产生、按键功能、串口通信等模块程序进行了设计。综合完成了逆变电源的软件设计。系统调试与结果分析5.1 系统性能参数(1)采用了STM32 单片机(STM32F030系列);(2)采用了低通滤波器,输出波形稳定;(3)取值范围在0到200Hz的输出频率;(4)取值范围在0到40V的输入直流电压 ;(5)取值范围在0到+40V的输出交流电压

25、幅值;(6)能够输出最大的电流为1 .5A ;(7)显示屏能够显示输入电压Input,输出频率Fr和输出电压AC的幅值。(8)可调节的输出的频率和幅值,采用按键或串口通信连接两种方式;(9)频率按键每次增幅1Hz,幅值按键每次增幅1V;(10)电源带有反接保护和过流保护;注:数值均为理想状态下结果实际存在一定偏差。5.2 实验结果分析接入电源后,输入电压为3.7V。设定频率为50hz输出电压为1v。图5-1 逆变电源实物图实际测得输出电压为0.92v如图:图5-2 时间输出电压图进行输出波形显示,图5-3为输入电压5v,输出频率为50Hz时的正弦波形图5-3 输出的正弦波形图5.2 本章小结进

26、行了逆变电源的实物测试,实现了由直流输入变为交流输出的过程,呈现了该有的正弦波形,但是与设计的实际所该有的数值存在一定误差,仍需努力改进。基本完成设计目标,软硬件设计能够实际完成系统要求。结论经过这一学期的努力,在和老师同学良好有效的交流讨论学习下,完成了本次课题的设计。从开始确定课题,申报课题,进行资料的学习研究,到通过对整个逆变电源系统的了解得以让自己设计出最终的成果,并且对其进行了实验调试,以及完成说明书的编写。自己能够完成了这次基于STM32单片机SPWM单相逆变电源的设计。逆变电源是一个应用十分广泛的设计,越来越多的出现在新能源充分利用的如今,所以逆变电源的发展必将推动着生活生产实践

27、的前行。本文所设计的单相逆变电源系统,主要基于STM32单片机,并且采用了SPWM正弦波调制的方法。选择了全桥逆变电路,并且设计了其配套所用的其他的电路。控制电路部分,使用了STM32F030系列芯片进行了反馈电路设计。具体的控制基于Keil开发环境下的程序编写,能对输入电压,输出电压,频率幅值等进行调节计算控制。最终通过整合安装的逆变电源系统能够满足了本次课题所要求的条件。通过这次对逆变电源的了解,发现了很多以前不曾涉及的方面。科技日新月异,我也应当学习更多的知识,以适应能够跟上社会发展的步伐。这次毕业设计中主要学习到了以下几点:(1)充分认识到逆变电源的发展历史和未来前景(2)能够自行地设

28、计组建出完整的逆变电源系统(3)对于SPWM调制方法有了深刻的了解(4)熟悉应用了STM32单片机完成毕设要求(5)学习了Keil进行程序的开发总的来说在这次毕业设计的完成中收获颇多,但是也存在着许许多多的问题有待自己去改进完善。人无完人,只有不断地去进行实践,才能检验出自己的真才实学。致谢参考文献1罗秦. 基于STM32的逆变电源设计与研究D.天津理工大学,2015.2刁元均.基于DSP的逆变电源数字控制技术的研究D.西安交通大学, 2007.3王子洋.单相逆变电源的智能控制研究D.燕山大学, 2005.4高摇光.单、三相逆变器SVPWM的新方案研究D.山东大学, 2010.5张静. Z源逆

29、变器控制及应用研究D.山东大学, 2010.6董金发.单相逆变电源的智能控制研究D.武汉理工大学, 2006.7张崇巍,张兴. PWM整流器及其控制M.北京,机械工业出版社,2003: 1-2.8王兆安,刘进军.电力电子技术M.5版.北京,机械工业出版社,2013.9张凯,王祥.基于STM32的新型SPWM逆变电源J.电气自动化,2012, 34(3):52-54.10魏伟.正弦波逆变电源的研究现状与发展趋势D.华中科技大学,2008.11刘凤君.正弦波逆变器M.北京,科学出版社,2002.12高奇. Z源逆变器的主电路研究D.浙江大学,2005.13吕小涛.基于DSP的正弦波逆变电源研究D.

30、武汉理工大学,2009.14王小龙,陈畅,龚敏.一种新型过流保护电路的设计J.电子与封装, 2010, 87(7): 16-19.15 Araujo S V, Zacharias P,and Mallwitz R. Highly Efficient Single- Phase TransformerlessInverters for Grid-Connected Photovoltaic Systems J. IEEE Transaction on Indusrial Electronics ,2010,57(9): 3118-3128.16 Gu B,Dominic JLai J S,et

31、al. High Reliability Efficient Single -Phase Transformerle Inverters for Grid-Connected Photovoltaic Systems J. IEEE Transaction on Power Electronics, 2013,8(5): 2235-2245.17李加升,李稳国,宋歌.基于STM32的单相正弦波逆变器设计J.湖南城市学院学报(自然科学版),2017,26(03):54-57.18刘峰.基于SPWM的3kW单相逆变器的仿真与设计D.河北大学,2016.19王兆安,刘进军.电力电子技术M 5版.北京

32、,机械工业出版社,2013.20张凯,王祥.基于STM32的新型SPWM逆变电源J.电气自动化,2012, 34(3): 52-54.21吕小涛.基于DSP的正弦波逆变电源研究D.武汉理工大学,2009.22王小龙,陈畅,龚敏. - -种新型过流保护电路的设计J.电子与封装, 2010, 87(7): 16-19.23宗荣芳.基于protel DXP的电路设计仿真J.电子工程师,2005, 31(1): 41 -47.24江国栋,徐丽萍.基于AD型单片机的中功率升压开关稳压电源设计J.南京工业职业技术学院学报,2009, 9(2): 12-13.25高玉峰,胡旭杰,陈涛,等.开关电源模块并联均

33、流系统的研究J电子工程, 2011(02): 210-212.26 D. M. Divan. The Resonant DC Link Converter-A New Concept in Static power ConversionJ.IEEE Trans.Ind.1989,25(2):317-325.27 Kedare.S.B,Date.A.W.Performance characteristics of a reciprocating wind machine. Journal of Wind Engincering and Industria AcrodynamicsS. 1999:

34、1125.28Chunwei Song,Rongxiang Zhao.Using fuzzy control for parallel-inverter system with nonlinear-load J.2010 International Conference on Electrical Machines and Systems(ICEMS).2010: 193-197.附录主程序/*时钟采用内部RC 8mhz : 2分频内部时钟送于锁相环 进行12倍频 等于48MhzTimer3定时器: 通道一PWM输出 PA6 通道二PWM输出 PA7按键可调节幅值/频率;输出正弦波频率=100

35、0000/(100*定时中断时间)功能:交流输出频率设置范围 注:随着频率增加 误差会加大,200hz时实际输出为182hz。交流输出幅值设置范围 注:此幅值为峰值。频率步进值:1hz。 允许误差精度0.005%-0.1%。幅值步进值:1V。 允许幅值误差 1.5V输出过流保护值:2A。大于2A即关闭输出,然后在电流小于0.12A时,5秒后再次打开输出。*/#include stm32f0 xx.h#include #include #include delay.h#include USART1.h#include Key.h#include oled.h#include ADC1.h ext

36、ern uint8_t UartRec5; extern uint8_t RecFlag; uint8_t pwm50=0,16,31,47,63,78,93,108,122,136,149,162,174,185,196,206,215,223,230,237,242,246,250,252,254,255,254,252,250,246,242,237,230,223,215,206,196,185,174,162,149,136,122,108,93,78,63,47,31,16; / 反正弦变化uint16_t Current=0; uint16_t Voltage=0;uint16_

37、t _voltage=0; /暂存值uint8_t Para=0; /幅值系数uint8_t VolTemp=0; /默认最大值 uint16_t PlvTemp=50; /默认值uint8_t _voltemp=0; /暂存值uint16_t _plvtemp=0; /暂存值uint16_t TimeCount=0; /用于计时uint16_t TimeCount1=0; /用于显示计时uint16_t TimeCount2=0; /用于更新频率和幅值 uint8_t ShortFlag=0; /过流标志 1过流/标识uint8_t zf=0; /半个周期切换标识uint8_t Value=

38、0; /正弦波幅值uint8_t Freq=4;/ 频率 默认50hz /函数声明void Display();void TIM2_Init(uint16_t period,uint16_t prescaler ); void TIM3_PWM_Init(uint16_t period, uint16_t prescaler);unsigned char zankongbi=10;/*平滑滤波算法*/#define FILTER_N 32int filter_bufFILTER_N + 1;int Filter() int i; int filter_sum = 0; filter_bufFI

39、LTER_N = RegularConvData_Tab0*10.473; for(i = 0; i 5);/(filter_sum / FILTER_N); int filter_buf1FILTER_N + 1;int Filter1() int i; int filter_sum = 0; filter_buf1FILTER_N = RegularConvData_Tab1; for(i = 0; i 5);/(filter_sum / FILTER_N);/PWM输出初始化/period:自动重装值/prescaler:时钟预分频数void TIM3_PWM_Init(uint16_t

40、 period, uint16_t prescaler)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE); /使能GPIO外设时钟使能 /设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形

41、GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; /TIM_CH1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; /复用推挽输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAF

42、Config(GPIOA, GPIO_PinSource6, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_1); TIM_TimeBaseStructure.TIM_Period = period; / 设置自动重装周期值 TIM_TimeBaseStructure.TIM_Prescaler = prescaler;/ 设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 1; /设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode =

43、 TIM_CounterMode_Up;/向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /初始化定时器3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;/ PWM2模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;/输出低 TIM_OC1Init(TIM3, &TIM_OCInit

44、Structure); /根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OC2Init(TIM3, &TIM_OCInitStructure); /根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);/使能预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);/使能预装载寄存器 TIM_Cmd(TIM3, ENABLE); / 使能定时器3 TIM_CtrlPWMOutputs(TIM3, EN

45、ABLE); /*定时时间Tout= (period)*(prescaler)/Tclk;Tclk:TIM2 的输入时钟频率(单位为 Mhz)。*/ void TIM2_Init(uint16_t period,uint16_t prescaler ) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_InitStructure.NVIC_IRQChannel =

46、 TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseStructure.TIM_Period = period; / 自动重装载寄存器周期的值(计数值) TIM_TimeBaseStructure.TIM_Prescaler = (prescaler - 1);/时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivi

47、sion = 0;/向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); / 清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2, ENABLE); void TIM14_Init(uint16_t period,uint16_t prescaler ) TIM_TimeB

48、aseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct

49、ure); TIM_TimeBaseStructure.TIM_Period = period; / 自动重装载寄存器周期的值(计数值) TIM_TimeBaseStructure.TIM_Prescaler = (prescaler - 1);/时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision = 0;/向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); TIM_Clea

50、rFlag(TIM14, TIM_FLAG_Update); / 清除溢出中断标志 TIM_ITConfig(TIM14,TIM_IT_Update,ENABLE); TIM_Cmd(TIM14, ENABLE); /核心代码/获取不同点数的正弦波数据/point: 一周期内的取样点数/maxnum: 一周期内对应DA输出最大值void getSinTab(uint8_t point,uint16_t maxnum)uint8_t i=0; float x=0; /弧度float jiao=0;/角度 分度角jiao=180.000/point; maxnum=maxnum*Para; /1v

51、系数 *输出峰值电压= 峰值pwmif(maxnum255) maxnum=255; for(i=0;i200) UartRec2=200; PlvTemp=UartRec2; if(UartRec1=2) /修改幅值if(UartRec2Voltage) UartRec2=Voltage; VolTemp=UartRec2; void Get_Voltage() Voltage=(Filter()/100;void Get_Current() Current=Filter1();void Keyscan()uint8_t keytemp=0;keytemp= GetKeyVal(0); if

52、(keytemp=3) /幅值加TimeCount2=0;if(VolTemp0)VolTemp-; else if(keytemp=1)/频率加TimeCount2=0;if(PlvTemp2)PlvTemp-; if(keytemp!=0) Display();void Display()/显示输入电压OLED_ShowNum(48,0,Voltage/100,1,16);OLED_ShowNum(56,0,Voltage%100/10,1,16);OLED_ShowNum(72,0,Voltage%10,1,16); /显示输出状态 if(ShortFlag=1) OLED_ShowSt

53、ring(96,0,(uint8_t*)Off,16);else OLED_ShowString(96,0,(uint8_t*)On ,16);/显示输出频率OLED_ShowNum(24,2,PlvTemp/100,1,16);OLED_ShowNum(32,2,PlvTemp%100/10,1,16);OLED_ShowNum(40,2,PlvTemp%10,1,16);/显示输出幅值/OLED_ShowNum(104,2,VolTemp/100,1,16);OLED_ShowNum(104,2,VolTemp%100/10,1,16);OLED_ShowNum(112,2,VolTemp

54、%10,1,16); int main(void) uint8_t i=0;uint8_t temp=255;uint16_t Fretemp=50; delay_init();KeyInit(); ENA_Set(); /使能L298 ADC1_DMA_Init(); USART1_Init(9600);printf(STM32F030F4P6 USART TESTrn); TIM3_PWM_Init(255,7);/7+1分频。PWM频率=48000000/(7+1)/(255+1)=23.4Khz TIM_SetCompare1(TIM3,0); /pwm ch1TIM_SetCompare2(TIM3,0);/ pwm ch2TIM2_Init(200,48); /(200*48)/48 =200us TIM14_Init(100,4800); /10msgetSinTab(50

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论