数字锁相环 逆变器 程序

合集下载

光伏逆变器锁相环实现方法

光伏逆变器锁相环实现方法

光伏逆变器锁相环实现方法以光伏逆变器锁相环实现方法为题,我们将介绍光伏逆变器锁相环的原理和实现方法。

光伏逆变器是将太阳能光伏电池板产生的直流电转换为交流电的设备。

而锁相环(Phase-Locked Loop,简称PLL)是一种常用的控制电路,用于将输入信号的相位与参考信号的相位保持同步。

光伏逆变器的锁相环主要用于控制电网连接,确保光伏电池板产生的交流电与电网的频率和相位保持一致。

下面我们将详细介绍光伏逆变器锁相环的实现方法。

光伏逆变器锁相环的核心部分是相位比较器(Phase Comparator)和低通滤波器(Low Pass Filter)。

相位比较器用于比较光伏电池板产生的交流电信号与参考信号的相位差,而低通滤波器则用于平滑输出信号。

通过不断调整逆变器的控制参数,使相位比较器输出的误差信号趋近于零,从而实现相位同步。

为了实现光伏逆变器锁相环的控制,需要采集光伏电池板产生的交流电信号和参考信号。

一般情况下,光伏电池板产生的交流电信号通过传感器采集,而参考信号可以通过电网提供或者使用外部稳定的时钟信号。

在实际应用中,为了提高锁相环的性能,可以采用增量式锁相环(Incremental Phase-Locked Loop,简称IPLL)。

增量式锁相环通过对相位差进行积分,可以提高相位比较器的输出精度和稳定性。

在光伏逆变器锁相环的实现中,还需要考虑噪声和干扰的抑制。

为了减小噪声和干扰对锁相环的影响,可以采用滤波器和抗干扰技术。

同时,还可以采用自适应控制算法来实时调整锁相环的参数,以适应不同的工作环境。

总结起来,光伏逆变器锁相环是一种重要的控制电路,用于保持光伏电池板产生的交流电与电网的频率和相位同步。

实现光伏逆变器锁相环的方法包括相位比较器和低通滤波器的设计、采集光伏电池板和参考信号、使用增量式锁相环和抑制噪声与干扰等。

通过合理设计和调整锁相环的参数,可以提高光伏逆变器的性能和稳定性,实现高效的光伏发电。

锁相环 逆变

锁相环 逆变

锁相环逆变
锁相环(Phase-Locked Loop,简称PLL)和逆变器(Inverter)是电子领域中两个不同的概念,它们通常在不同的应用中使用。

1.锁相环(PLL):PLL 是一种电子电路,通常用于频率合成、时
钟恢复和相位同步等应用。

它的基本原理是通过比较输入信号
和一个内部振荡器的输出,然后调整振荡器的频率和相位,使
输出信号与输入信号保持稳定的相位关系。

PLL 可用于从不稳
定的时钟信号中生成稳定的时钟,或者用于将信号的频率锁定
到特定的参考频率。

在通信系统、数字电路和射频应用中广泛
使用。

2.逆变器(Inverter):逆变器是一种电子设备,用于将直流电(DC)
转换为交流电(AC)。

它通常用于太阳能发电系统、风能发电系
统、电动汽车、UPS(不间断电源)等应用中,将储存的直流电
能或可再生能源的直流输出转换为可用于电网或电器设备的交
流电。

逆变器可以有不同的类型,如脉宽调制逆变器、谐波逆
变器等,具体类型取决于应用和性能需求。

这两个概念在电子领域中有不同的应用领域,通常不直接相关。

锁相环用于时钟和信号处理,而逆变器用于能源转换和电源供应。

全数字锁相环2

全数字锁相环2

全数字锁相环25 全数字锁相环FPGA实现的总结在本设计中的⼀阶全数字锁相环使⽤Mentor公司的ModelSim6.0软件进⾏设计的功能仿真以及Altera公司的QuartusII7.2软件时序仿真并且进⾏设计综合,并采⽤Altera的cyclone系列的EP1C6Q240C8 FPGA器件实现。

实验测试结果表明:本设计中DPLL时钟可达到10MHz,性能较⾼;⽽使⽤了256逻辑单元,占⽤资源很少。

下⾯给出详细描述全数字锁相环的⼯作过程。

(1)当环路失锁时,异或门鉴相器⽐较输⼊信号(fin)和输出信号(fout)之间的相位差异,并产⽣K变模可逆计数器的计数⽅向控制信号(dnup);(2) K变模可逆计数器根据计数⽅向控制信号(dnup)调整计数值,dnup为⾼进⾏减计数,并当计数值到达0时,输出借位脉冲信号(borrow);为低进⾏加计数,并当计数值达到预设的K模值时,输出进位脉冲信号(carryo);(3)脉冲加减电路则根据进位脉冲信号(carryo)和借位脉冲信号(borrow)在电路输出信号(idout)中进⾏脉冲的增加和扣除操作,来调整输出信号的频率;(4)重复上⾯的调整过程,当环路进⼊锁定状态时,异或门鉴相器的输出se为⼀占空⽐50%的⽅波,⽽K变模可逆计数器则周期性地产⽣进位脉冲输出carryo和借位脉冲输出borrow,导致脉冲加减电路的输出idout周期性的加⼊和扣除半个脉冲。

本次设计中开始遇到了很多困难,开始通过多⽅⾯查找资料并了解全数字锁相环的原理及⽅案,锁相环⼀般都是模拟的居多,关于数字的资料⽐较少,所以查阅资料花了⼤量时间;在确定全数字锁相环设计原理后,开始学习硬件描述语⾔verilog HDL,学习FPGA器件的使⽤,学习Mentor公司的ModelSim6.0软件来作功能仿真以及⽤Altera公司的QuartusII7.2软件进⾏时序仿真以及下载配置的等问题。

附录1.数字锁相环的顶层模块module pll_top (fin,fout,se,clk,reset,enable,Kmode,fin_dac,fout_dac);input fin,clk; //clk时钟100ns(10MHZ)input reset,enable; //reset⾼电平复位,enable⾼电平有效input [2:0]Kmode; //滤波计数器的计数模值设定output fout; //fout是锁频锁相输出output [7:0]fin_dac,fout_dac;//fin_dac,fout_dac分别是两个输⼊输出信号经过数模dac的输出output se;wire idout,reset,ca,bo;wire [14:0]N;xormy u1(.a(fin),.b(fout),.y(se));Kcounter u2(.Kclock(clk),.reset(reset),.dnup(se),.enable(enable),.Kmode(Kmode),.carryo(ca),.borrow(bo)); IDCounter u3(.IDclock(clk),.reset(reset),.inc(ca),.dec(bo),.IDout(idout));counter_N u4(.clk(clk), .fin(fin), .reset(reset), .count_N(N));div_N u5(.clkin(idout),.n(N),.reset(reset),.clkout(fout));dac u6(.clk(fin),.dout(fin_dac),.dd());dac u7(.clk(fout),.dout(fout_dac),.dd());endmodule2.异或门鉴相器模块module xormy(a,b,y);//异或门鉴相器input a,b;output y;reg y;always @(a or b)beginy=a^b;endendmodule3.K模计数器模块module KCounter(Kclock,reset,dnup,enable,Kmode,carryo,borrow);input dnup; //鉴相器输出的加减控制信号input enable; //可逆计数器计数允许信号,⾼电平有效input [2:0]Kmode; //计数器模值设置信号output carryo; //进位脉冲输出信号output borrow; //借位脉冲输出信号wire carryo,borrow;reg [8:0]Count; //可逆计数器reg [8:0]Ktop; //预设模值寄存器//根据计数器模值设置信号Kmode来设置预设模值寄存器的值always @(Kmode)begincase(Kmode)3'b001:Ktop<=7;3'b010:Ktop<=15;3'b011:Ktop<=31;3'b100:Ktop<=63;3'b101:Ktop<=127;3'b110:Ktop<=255;3'b111:Ktop<=511;default:Ktop<=15;endcaseend//根据鉴相器输出的加减控制信号dnup进⾏可逆计数器的加减运算always @(posedge Kclock or posedge reset)beginif(reset)Count<=0;else if(enable)beginif(!dnup)beginif(Count==Ktop)Count<=0;elsebeginif(Count==0)Count<=Ktop;elseCount<=Count-1;endendend//输出进位脉冲carry和借位脉冲borrowassign carryo=enable&(!dnup)&(Count==Ktop);assign borrow=enable&dnup&(Count==0);endmodule4.脉冲增减模块module IDCounter (IDclock,reset,inc,dec,IDout);//脉冲增减模块input IDclock,reset,inc,dec;output IDout;reg IDout;reg inc_new,dec_new,inc_pulse,dec_pulse;reg delayed,advanced,Tff;always @(posedge IDclock)beginif(!inc)begininc_new<=1;inc_pulse<=0;endelse if (inc_pulse)begininc_new<=0;inc_pulse<=0;inc_pulse<=1;inc_new<=0;endelsebegininc_pulse<=0;inc_new<=0;endendalways @(posedge IDclock) beginif(!dec)begindec_new<=1;dec_pulse<=0;endelse if (dec_pulse)begindec_new<=0;dec_pulse<=0;endelse if (dec&&dec_new) begindec_pulse<=1; dec_new<=0;endelsebegindec_pulse<=0;dec_new<=0;endendbegin Tff<=0; delayed<=1;advanced<=1; end elsebeginif (inc_pulse)begin advanced<=1;Tff<=!Tff; endelse if(dec_pulse)begin delayed<=1; Tff<=!Tff; endelse if (Tff==0)beginif(!advanced)Tff<=!Tff;else if(advanced)begin Tff<=Tff; advanced<=0; endendelsebeginif (!delayed)Tff<=!Tff;else if(delayed)begin Tff<=Tff;delayed<=0; endendendendalways @(IDclock or Tff)beginif (Tff)IDout=0;elsebeginif(IDclock)IDout=0;elseendendmodule5.N分频参数控制模块module counter_N (clk, fin, reset, count_N);//利⽤clk对fin脉冲的测量并给出N值 input clk, fin, reset;output [14:0] count_N;reg [14:0] count_N;reg [15:0] cnt;reg cnt_en;reg load;wire cnt_clr;always @ (posedge fin )//fin上升沿到的时候,产⽣各种标志以便后⾯控制beginif (reset)begincnt_en=0;load=1;endelsebegincnt_en=~cnt_en;load=~cnt_en;endendassign cnt_clr=~(~fin & load);always @(posedge clk or negedge cnt_clr)beginif (!cnt_clr)cnt=0;else if (cnt_en)cnt=0;elsecnt=cnt+1;endendalways @ (posedge load)begincount_N=cnt/2; //这⾥取fin周期的⼀半endendmodule6.N分频器模块module div_N (clkin,n,reset,clkout); //N分频模块 input clkin,reset;input [14:0] n;output clkout;reg clkout;integer count;always@(posedge clkin)if(reset)beginclkout=0;count=0;endelsebeginif(count>=(n/2)-1)begin clkout<=~clkout;count<=0;endelsecount<=count+1;endendmoduleoutput[7:0] dout;output[7:0] dd;reg [7:0] dout;reg [7:0] dd;reg [7:0] d;reg [5:0] q;always @(posedge clk)beginif (q<63 ) q<=q+1; else q<=0; endalways@( q )begincase(q)00: d<=255; 01: d<=254; 02: d<=252; 03: d<=249; 04: d<=245; 05: d<=239; 06: d<=233; 07: d<=225; 08: d<=217; 09: d<=207; 10: d<=197; 11: d<=186; 12: d<=174; 13: d<=162; 14: d<=150; 15: d<=137; 16: d<=124; 17: d<=112; 18: d<=99; 19: d<=87; 20: d<=75; 21: d<=64; 22: d<=53; 23: d<=43;24: d<=34; 25: d<=26; 26: d<=19; 27: d<=13;28: d<=8; 29: d<=4; 30: d<=1; 31: d<=0;32: d<=0; 33: d<=1; 34: d<=4; 35: d<=8;36: d<=13; 37: d<=19; 38: d<=26; 39: d<=34;40: d<=43; 41: d<=53; 42: d<=64; 43: d<=75;44: d<=87; 45: d<=99; 46: d<=112; 47: d<=124; 48: d<=137; 49: d<=150; 50: d<=162; 51: d<=174; 52: d<=186; 53: d<=197; 54: d<=207; 55: d<=217; 56: d<=225; 57: d<=233; 58: d<=239; 59: d<=245; 60: d<=249; 61: d<=252; 62: d<=254; 63: d<=255; default : d<=0;endcasedd<=d;end。

弱电网条件下锁相环对LCL型并网逆变器稳定性的影响研究及锁相环参数设计

弱电网条件下锁相环对LCL型并网逆变器稳定性的影响研究及锁相环参数设计

弱电网条件下锁相环对LCL型并网逆变器稳定性的影响研究及锁相环参数设计1. 本文概述随着可再生能源的广泛应用和电力电子技术的发展,LCL型并网逆变器在弱电网条件下的稳定性问题引起了广泛关注。

本文旨在研究弱电网条件下锁相环(PhaseLocked Loop, PLL)对LCL型并网逆变器稳定性的影响,并提出一种有效的锁相环参数设计方法。

本文分析了弱电网条件下LCL型并网逆变器的工作原理,明确了锁相环在系统稳定性中的关键作用。

接着,详细探讨了锁相环对系统稳定性的影响机制,包括其对系统动态响应、谐波抑制以及系统抗干扰能力的影响。

进一步地,本文针对锁相环参数设计问题,提出了一种基于系统稳定性和动态性能综合优化的参数设计方法。

该方法不仅考虑了锁相环的快速性和准确性,还兼顾了系统在弱电网条件下的稳定性和鲁棒性。

通过仿真和实验验证,本文所提出的锁相环参数设计方法在提高LCL型并网逆变器在弱电网条件下的稳定性方面具有显著效果。

本文的研究成果对于促进可再生能源的高效利用和电网稳定运行具有重要意义,并为类似系统的设计和优化提供了理论指导和实践参考。

2. 型并网逆变器与锁相环的基本原理在弱电网条件下探讨锁相环(PhaseLocked Loop, PLL)对LCL 型并网逆变器稳定性的影响以及锁相环参数设计,首先需要理解并网逆变器和锁相环的基本原理。

LCL型并网逆变器是一种广泛应用在新能源发电系统中的关键设备,特别是光伏和风能发电系统中。

它的结构主要包括逆变器、LCL 滤波器和并网接口。

LCL滤波器由串联的电感(L)和两个并联的电容(C)组成,这种配置能显著减少输出电流的谐波含量,提高电能质量,同时降低了对电网的电磁干扰。

LCL滤波器引入了固有的三阶动态特性,可能会导致谐振现象,对系统稳定性构成挑战。

为了保证并网逆变器能在宽频范围内稳定且高效地工作,需要设计有效的电流控制器,并结合电容电流反馈实现有源阻尼,以抑制LCL滤波器产生的谐振。

stm32f407锁相环程序

stm32f407锁相环程序

STM32F407 锁相环程序1. 什么是锁相环?锁相环(PLL,Phase-Locked Loop)是一种常见的控制电路,用于将一个参考信号的相位和频率与一个输出信号同步。

它通常由一个比例-积分控制器(PI 控制器)、一个相位频率检测器(PFD,Phase Frequency Detector)、一个低通滤波器(LPF,Low Pass Filter)和一个电压控制振荡器(VCO,Voltage Controlled Oscillator)组成。

2. STM32F407 锁相环STM32F407系列是意法半导体(STMicroelectronics)的一款32位Cortex-M4微控制器,它具有高性能的处理能力和丰富的外设。

STM32F407可以通过其内置的锁相环模块(PLL)来生成稳定的时钟信号。

3. 锁相环程序实现步骤下面是一个简单的演示如何在STM32F407上实现锁相环的程序。

请注意,这只是一个示例程序,具体实现可能因应用场景而有所不同。

步骤1:配置系统时钟首先,我们需要配置STM32F407的系统时钟。

这可以通过设置相关的寄存器来完成。

例如,我们可以选择使用外部晶体振荡器作为主时钟源,然后设置PLL参数以获得所需的时钟频率。

步骤2:初始化锁相环模块在这一步中,我们需要初始化锁相环模块,配置相关的寄存器以使其工作在我们所需的方式下。

这包括设置PLL输入时钟源、选择输出时钟的倍频因子、配置PLL分频因子等。

步骤3:等待锁定在配置锁相环之后,我们需要等待锁相环模块稳定并锁定到我们所需的频率。

在这个过程中,我们可以使用相关的状态位或中断来监测锁相环的状态,以便在锁定之前等待。

步骤4:配置输出时钟一旦锁相环模块稳定并锁定到所需的频率,我们就可以配置输出时钟。

这可以通过设置相关的寄存器来实现,以使其输出到我们所需的GPIO引脚或其他外设。

4. 总结在STM32F407上实现锁相环的程序可以通过配置系统时钟、初始化锁相环模块、等待锁定和配置输出时钟这几个步骤来完成。

光伏逆变器锁相环实现方法

光伏逆变器锁相环实现方法

光伏逆变器锁相环实现方法光伏逆变器是将光伏电池阵列收集到的直流电能转换为交流电能的设备。

在光伏逆变器中,锁相环(Phase-Locked Loop,简称PLL)是一个重要的控制系统,用于实现电网电压和逆变器输出电压的同步。

本文将介绍光伏逆变器锁相环的实现方法。

1. 锁相环概述锁相环是一种用于追踪和锁定输入信号频率的反馈控制系统。

它由相频比较器、低通滤波器和控制电压发生器组成。

在光伏逆变器中,锁相环的作用是将逆变器输出电压的频率和相位与电网电压保持一致,以实现电能的有效注入和并网运行。

2. 锁相环的工作原理光伏逆变器锁相环的工作原理可以分为三个主要步骤:相频比较、滤波和控制电压生成。

2.1 相频比较:锁相环通过将电网电压和逆变器输出电压进行相频比较,得到频率和相位差。

比较器的输出信号表示了两个电压信号之间的相位偏差。

2.2 滤波:比较器的输出信号经过低通滤波器滤波,去除高频噪声和杂散信号,得到平滑的控制信号。

2.3 控制电压生成:滤波后的控制信号被送入控制电压发生器,根据信号的大小和方向,控制电压发生器会产生相应的控制电压,用于调整逆变器的输出频率和相位,使其与电网电压保持同步。

3. 光伏逆变器锁相环的实现方法光伏逆变器锁相环的实现方法主要包括相频检测、滤波和控制电压生成。

3.1 相频检测:相频检测是通过比较电网电压和逆变器输出电压的相频差来实现的。

常用的相频检测方法有零交叉检测法和频率锁定环检测法。

零交叉检测法通过检测电压波形的零交叉点来确定相频差。

频率锁定环检测法则通过比较两个电压波形的周期性来确定相频差。

这两种方法各有特点,可以根据实际需求选择适合的方法。

3.2 滤波:滤波是为了去除相频检测过程中产生的高频噪声和杂散信号。

常用的滤波方法有低通滤波和带通滤波。

低通滤波器可以去除高频噪声,使得控制信号更加平滑。

带通滤波器则可以选择特定频率范围内的信号,对逆变器输出进行更精确的控制。

3.3 控制电压生成:控制电压生成是根据滤波后的控制信号来生成用于调整逆变器输出频率和相位的控制电压。

11.数字锁相环

11.数字锁相环

实验十一 数字锁相环
Байду номын сангаас
3.实验中可能遇到的问题
(1)数字锁相环的概念 (2)数字锁相环电路的调试步骤和方法
4.难点
数字锁相环的性能分析
7
8
实验十一 数字锁相环
实验十一 数字锁相环 (3)若Xi的频率和Xl的固有频率之比为n:m (n,m为正整数),数字锁相环能否正 常工作?此时系统的正常工作频率范围 和相位跟踪误差与n和m的关系如何?
5.思考题
(1)数字锁相环输出信号Xl的工作频率的 提高会受到哪些因素的影响? (2)实验电路中,用一级D触发器组成鉴 相器,两个输入端口的信号能否互换? 如要互换,电路要做哪些修改?
9
10
2
实验十一 数字锁相环
实验十一 数字锁相环
⒈实验目的
(1)了解数字锁相环的组成及工作原理。 (2)掌握一种典型数字锁相环的实现方法。 (3)分析与测量数字锁相环的频率锁定范围 及相位跟踪误差。
2.实验内容
(1)试验原理 (a)基本的锁相系统是一个反馈系统, 它是由相位比较器(鉴相器)、低通滤 波器(环路滤波器)和电压控制振荡器 组成。 (b)数字锁相环
1
2
实验十一 数字锁相环
实验十一 数字锁相环 (2)将分频比设为256,信号发生器输 出 为0~5V的方波,频率为4.434MHz/256 = 17320Hz。监测数字锁相环的参考信号Xi 和输出信号Xl。微调Xi频率,观察Xl和 Xi是否锁相。测量该数字锁相环正常工 作频率范围fH和fL,并与理论值相比较。
2
6 5 4 3
11 12 13 14
11 12 13 14
QD QC QB QA
2 U2A

锁相环程序的编制

锁相环程序的编制

PIC16C54C锁相环程序设计说明参考资料:MB15E07SL.PDFPIC16C54X.PDF340M多频点窄带高速图像传输系统中锁相环是利用PIC单片机程序控制MB15E07SL芯片实现的,下面就其实现过程加以陈述。

一、PIC16C54C单片机PIC16C54C为8位单片机,指令字长12位,全部指令都是单字节指令,系统为哈佛结构,数据总线和程序总线各自独立分开,数据总线宽度为8位,程序总线宽度为12位,内部程序存储器为512×12位,内部数据寄存器为32×8位。

PIC16C54C有12根双向可独立编程I/O引脚,分为PortA和PortB两个端口,其中PortA为RA0~RA3,PortB为RB0~RB7,每根I/O引脚可由程序来编程决定其输入输出方向。

PIC16C54C提供四种可选振荡方式:-RC,低成本的阻容振荡方式-XT,标准晶体/陶瓷振荡-HS,高速晶体/陶瓷振荡-LP,低功耗,低频晶体振荡我们在设计中采用的是XT,标准晶体/陶瓷振荡方式。

二、MB15E07SL数字锁相环芯片MB15E07SL是一个串行输入的相位循环锁定频率合成器。

具有以下特点:1、高频操作:最大2.5GHz2、两种预分频系数32和643、工作电压2.4V~3.6V4、串行输入14位可编程参考分配器5、二进制7位抑制计数器6、二进制11位可编程计数器7、软件可选充电棒电流8、内置相位控制和相位比较锁相环的分频频率计算公式:fo=[(M×N) +A] ×fi÷R,(A<N)fo:外部电压控制振荡器的输出频率;M:预分频系数(32或64)N:预置二进制11位可编程计数器(3~2047)A:预置二进制7位抑制计数器(0~127)fi:参考频率振荡器的输出频率R:串行输入14位可编程参考分配器(3~16383)计算公式中的各参数通过外部信号串行输入MB15E07SL内部的19位移位寄存器,并载入锁存生效,其中19位移位寄存器各控制位的定义参见表1和表2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//DSPIC30F2010 单相逆变带数字锁相环程序#include <p30f2010.h> //中断优先级还没设置,先t2,t1,spwm,其他#include <timer.h>#include <math.h>#include "lcd.h"#define _T1ON T1CONbits.TON#define _T2ON T2CONbits.TON_FOSC(CSW_FSCM_OFF & XT_PLL8);_FWDT(WDT_OFF);_FBORPOR( RST_PWMPIN& PWMxH_ACT_HI& PWMxL_ACT_HI&PBOR_OFF & MCLR_EN);_FGS(CODE_PROT_OFF);void IC2_INI(void);void T2_INI(void);void PWM_INI(void);void AD_INI(void);void T1_INI(void);void PWM_CAL(unsigned int ,unsigned int k,unsigned int a );void IOUT_PROTECT(void);void US_PROTECT(void);void PROTECT_RE(void);void PID_CAL(void);void smooth_test(unsigned int ,unsigned int );void smooth_3_test(unsigned int a,unsigned int b,unsigned int c);unsigned int IC2_0,IC2_1; //捕捉周期用,前后相减unsigned long CAP_T,CAP_T_0; //捕捉得到的周期,不过有分频,记得<<3 unsigned int CAP_N,PWM_N,AD_N,T1_N;unsigned int AD0,AD1; //ADCBUF的结果读到这里来,采样满64次后,转存并清空,记得清空unsigned int UD,US,AD_N_200,AD_N_50; //AD转存的数据,供外部计算用,64次计数到位unsigned int AD2,AD3,IOUT,UO; //正弦波采样采用均方根的方法要用32位变量来存,ad结果和转存数unsigned int Kp,Ki,Ud0,Ud1,Us0,Us1; //pid环节数,和2次处理的采样电压数据unsigned int UD_10,US_10,IOUT_10,UO_10; //采样结果,转换为10位的有效值,unsigned int RE_DELAY; //保护后延迟计数,计数1时,等于一个周波50个约1sunsigned char PROTECT_FLAG; //保护标志位unsigned int io_10_0,io_10_1,io_10_2,io_10_max_temp,io_10_max,smooth_fail_n; //电流采样的全局变量const unsigned int d1[100]= //0~90度份100份的正弦{515 ,1544 ,2573 ,3601 ,4629 ,5655 ,6680 ,7703 ,8724 ,9743 ,10760 ,11774 ,12785 ,13793 ,14798 ,15799 ,16796 ,17789 ,18778 ,19762 ,20741 ,21715 ,22683 ,23646 ,24603 ,25554 ,26499 ,27437 ,28369 ,29293 ,30210 ,31120 ,32022 ,32916 ,33803 ,34680 ,35549 ,36410 ,37261 ,38103 ,38936 ,39760 ,40573 ,41376 ,42170 ,42952 ,43724 ,44486 ,45236 ,45976 ,46703 ,47420 ,48125 ,48817 ,49498 ,50167 ,50823 ,51467 ,52097 ,52716 ,53321 ,53913 ,54491 ,55056 ,55608 ,56146 ,56670 ,57180 ,57676 ,58158 ,58625 ,59078 ,59516 ,59940 ,60349 ,60742 ,61121 ,61485 ,61834 ,62167 ,62486 ,62788 ,63075 ,63347 ,63603 ,63843 ,64068 ,64277 ,64470 ,64647 ,64808 ,64953 ,65082 ,65195 ,65292 ,65372 ,65437 ,65485 ,65518 ,65534 ,};unsigned int PWM_N,k,a; //n=当前在的段的位置,k映射到0~99的查表位置,a变比后期主要控制这个unsigned long temp;//*************************************************//主程序//**************************************************int main(void){LCD_Init();LCD_WRITE_8BIT(LINE1,CMD);DISP_10(78);PWM_INI();AD_INI();T1_INI();// T2_INI();// _T2ON=1;// IC2_INI();// _IC2IE=1;_T1ON=1;_T1IE=1;_ADON=1;_ADIF=0;_ADIE=1;a=32768;//while(_IC2IF==0) //过零点时启动pwm _PTEN=1;_PWMIE=1;_PWMIP=7;Ki=60;Kp=7;IOUT_10=1;while(1){LCD_WRITE_8BIT(LINE1,CMD);DISP_10(IOUT_10);DISP_10(UD_10);nop;delay1ms(200);}}//*************************************//捕捉初始化程序,IC1 IC2//**************************************void IC2_INI(void){ _TRISD1=1;//IC2CONIC2CONbits.ICSIDL=0; //空闲运行IC2CONbits.ICTMR=1; //1=采样tmr2,0=采样tmr3IC2CONbits.ICI=0B00; //每1次捕捉中断//IC2CONbits.ICOV //只读,溢出//IC2CONbits.ICBNE //只读,缓冲器非空IC2CONbits.ICM=0B011; //每一个上升沿捕捉一次//000=关闭捕捉_IC2IF=0;_IC2IE=0;}//*******************************************//T2初始化,为ic2提供时基//*******************************************void T2_INI(void){T2CONbits.TON=0; //设置前关闭T2CONbits.TSIDL=0; //空闲运行T2CONbits.TGATE=0; //门控计数禁止T2CONbits.TCKPS=0B01; //1:8T2CONbits.T32=0; //禁止32位计数T2CONbits.TCS=0; //内部时钟源TMR2=0; //初始化计数值PR2=49999; //周期满,就是不周期T2CONbits.TON=0; //定时器工作_T2IF=0;_T2IE=0;}//******************************************//IC2捕捉中断程序,锁频锁相用;入口参数IC2BUF,出口参数PTPER,PWM_N//*******************************************void __attribute__ ((interrupt)) _IC2Interrupt(void){_IC2IF=0;PWM_N=200; //实现锁相IC2_0=IC2_1;IC2_1=IC2BUF;CAP_T_0=CAP_T;if(IC2_0<IC2_1)CAP_T=(long)IC2_1+50000-IC2_0;else CAP_T=(long)IC2_1+100000-IC2_0;if(CAP_T<CAP_T_0+64 && CAP_T>CAP_T_0-64) return;PTPER=(CAP_T<<3)/400-1; //重新设置pwm周期,实现锁频// PWM_N=200; //实现锁相PR1=(CAP_T<<3)/200-1; //定时器1 ,1:1分频,一个周期分为64份,为ad提供出发时间//这里把PR1的结果多减去几个,这样一个周期完成,使得定时器的时间多点,//要是少了就麻烦,采样次数会少一个,这样对电流采样是要守相位的很不利,//于是把它减小几个,这样在pwm_n=0是,定时器会多点时间,把时间清掉,就可以保证相位了。

必须保证最大值在相位区间内//结果在pwm中断中开始相位补偿,这里就不补了,要不然这个数不好确定CAP_N++;if(CAP_N==64)CAP_N=0;return;}//**********************************************void __attribute__ ((interrupt)) _PWMInterrupt(void)//**********************************************{_PWMIF=0; //_PWMIF=0;/* if(PWM_N==0) //把t1 的ad时间清理,保住采样相位,对才交流有效,这里进行相位补偿,多减少加{ //无论这里pwm_N=多少,都没关系,只要一个周期进行一次时间补偿就行了。

if(TMR1<(PR1>>1)) TMR1=0;else TMR1=PR1-10;}*/if(PWM_N<100){k=PWM_N;PWM_CAL(PWM_N,k,a);}else if(PWM_N<200){k=200-PWM_N-1;PWM_CAL(PWM_N,k,a);}else if(PWM_N<300){k=PWM_N-200;//负数的PWM_CAL(PWM_N,k,a);}else if(PWM_N<400){k=400-PWM_N-1;PWM_CAL(PWM_N,k,a);}PWM_N++;if(PWM_N==400)PWM_N=0;_PWMIF=0;}//*****************************************************void PWM_CAL(unsigned int n,unsigned int k,unsigned int a ) //占空比计算,调用= PWM_CAL(n,k,a);//*****************************************************{unsigned int _sin,tempd; //a=变比,_sin=查表得正弦值,tempd=a*_sin>>17;unsigned long a_sin,temppdc; //a_sin=a*_sin,temppdc=PTPER*tempd;_sin=d1[k];//PDC1=PTPER*(1+-a*_sin)// ***<<32// a、_sin 小于1,都扩大2^16倍,a_sin=a;a_sin=a_sin*_sin; //计算结果为32位a_sin=a_sin>>17;//移动后是15位***>>17tempd=a_sin; //结果存起来if( n<200)tempd=32768+tempd; //加1,结果为16位;1被扩大了2^15倍,两个15位数相加为16位;else tempd=32768-tempd;temppdc=(PTPER+1); //_16*_16为_32temppdc=temppdc*tempd;temppdc=temppdc>>15; //结果>>16得到16位要的结果***>>15 (**扩大和缩小移位刚好全抵消**)。

相关文档
最新文档