
关于频率和占空比的确定,对于6M晶振,假定PWM输出频率为1KHZ,;这样可以设定占空比可从(1-100)%变化,即001ms100=1ms。周期用T1定时,输出高电平用T1定时。
#include <REGX51H>
#define uchar unsigned char
#define V_TH1 0XFE
#define V_TL1 0X0C
#define V_TMOD 0X11
void init_sys(void); /系统初始化函数/
unsigned char ZL,ZH;
void main (void)
{
init_sys();
while(1)
{
Unsigned Int temp;
int16 zkb=50;
Temp =2^16-5zkb;
ZH = temp/256;
ZL = temp%256;
K();
}
}
void init_sys(void) /系统初始化函数/
{
TMOD=V_TMOD; /定时器初化/
TH0=ZH;
TL0=ZL;
TH1 = V_TH1;
TL1= V_TL1;
TR1 = 1;
ET1 = 1;
ET0=1; /允许T0中断
EA=1; /CPU开中断
}
Void k(int16 vk,ik)
{ static int16 prek;
pk=vkik;
prek=0;
vk=0;
if(prvpk==pk)
{
return;
}
else
{
if(pk>prepk)
{ prek=pk;
if(vk>prevk)
{
zkb++;
prevk=vk;
prepk=pk;
}
else
{
zkb--;
prevk=vk;
prepk=pk;
}
}
else
{
if(vk>prevk)
{
zkb++;
prevk=vk;
prepk=pk;
}
else
{
zkb--;
prevk=vk;
prepk=pk;
}
}
}
/中断函数/
void timer0(void) interrupt 1
{
P2_2=! P2_2;
TR0 = 0;
}
Void timer1(void) interrupt 2
{
TH1 = V_TH1; /恢复定时器T0初始值/
TL1 = V_TL1;
P2_2=! P2_2;
TH0=ZH; /恢复定时器T0初始值/
TL0=ZL;
TR0 = 1;
}
MPPT技术已成研究热点,其控制方法多样,控制效果不尽相同,实现过程也大有区别。
根据文[123],可将各种控制方法分为间接近似控制法、直接采样控制法以及人工智能控制法3大类。
初学者我建议你买《手把手教你学DSP》。这本书非常适合于初学者,我就是用这本书学的,而且在他们论坛上有全套视频教程。我可以这么告诉你,你只用买这一本书就够了,完全可以掌握2812的所有外设模块。当时我用一个星期的时间将所有视频看完,然后拿公司的开发板写一下基本程序,大概一个月就掌握的差不多了。
ps:说实在的,我不建议拿dsp开发项目,我比较推荐stm32,有以下几点原因:
dsp太贵,一块片子近200快,arm7才十几块钱。
dsp太娇气,你看dsp的硬件电路就会发现它所用的电容比一般的MCU要多(为了稳定电源电压),很容易出现硬件问题,不适合初学者,很容易让人郁闷。相对于的51单片机就比较皮实,5v供电,差一点没有关系,基本都能工作。只要不将电源和地接反就不会烧。
arm7里面功能模块比dsp要多很多,基本上开发一个项目是没问题的。
dsp有个特有的cmd文件需要人工手动编写(代码少的就不用了,直接用通用的就行),用来分配代码和数据的存储空间,还分为固化到flash上的cmd文件和调试在ram上的cmd文件。按理说这种很底层的东西不应该由开发人员来做而是由编译器完成的。而且将程序固化的flash中还没完,因为代码在ram中运行速度比在flash中快,所以你将代码固化到flash中之后,运行速度没有在调试时快。这时又涉及到代码搬移的问题,即代码存放到flash中,开机运行的时候将代码搬到ram中运行。这个过程也有点小小的复杂,当时我将代码写完,就为了将代码固化到flash中就废了好长时间。记得有一次我不小心将一个段放到密匙区了,结果莫名其妙的dsp就锁死了。查资料整了半天,最后将机器码都搞出来了,在一大堆数据中终于找到了密匙。相比较之下,arm7你写完程序,点击一下下载,就完事了。没有这么多条条框框。
dsp的编译环境ccs界面相比较keil而说也逊色了不少。
说了这么半天,好像没说dsp的优点。dsp当然有优点了,人家主频就是高、速度就是快,运算能力就是强。其实stm32的主频最高也有72M了,我觉得速度要求不高的话,可以考虑考虑。
总之,你用完dsp之后,你就会发现其他的cup用起来怎么这么easy呢?
#include "16F877h"
#device ADC = 8 // 一个8位寄存器ADC模式
#fuses HS, NOWDT, PUT, NOPROTECT, BROWNOUT, NODEBUG, NOLVP // High-Speed 20MHz, No Watchdog, No Protection, Brownout Protection,
#use delay(clock=20000000) // 20MHz Crystal
//int is defined as 8-bit unsigned integer using CCS compiler
void main (void)
{
signed int direction;
int delta;
int pwm;
int upperbound;
int lowerbound;
float power;
float powerold;
float voltage;
float voltagedrop;
float voltagedifference;
float currentma;
float measuredvoltage;
float measuredvoltagedrop;
direction = 1; // Set initial direction to positive
delta = 1; // Amount by which to adjust the PWM - 7-bit resolution so duty step of 2%
pwm = 26; // Initial position of the PWM - 50% Duty Cycle with 7-bit resolution
upperbound = 49; // Upper bound of the PWM %
lowerbound = 1; // Lower bound of the PWM %
power = 0; // Initial Value of Power
setup_adc(ADC_CLOCK_DIV_32); // ADC clock
setup_adc_ports(ALL_ANALOG); // Set all inputs to analog
output_low(PIN_C1); // Set CCP1 output low
setup_ccp1(ccp_pwm); // setup pin CCP1 (RC2) to do PWM
setup_timer_2(T2_DIV_BY_1,12,1); // 384615kHz
while (1)
{
//delay_ms(1000) // Wait 1 Second
set_adc_channel(0); // Select RA0
//delay_ms(20); // Wait to Read ADC
measuredvoltage = read_adc(); // Read the voltage input from ADC channel 0
set_adc_channel(1); // Select RA1
//delay_ms(20); // Wait to Read ADC
measuredvoltagedrop = read_adc(); // Read the Voltage dropped across the R from ADC channel 1
voltage = measuredvoltage/51; // Measured Voltage is 51 steps per Volt at a Reference Voltage of 5V
voltagedrop = measuredvoltagedrop/51;
voltagedifference = voltage - voltagedrop;
currentma = voltagedifference; // Calculating Current using 1K Resistance
powerold = power; // Calculate the Power from the inputs
power = voltage currentma;
pwm = pwm + directiondelta; // Adjust Pulse Width Modulation Value by Delta value
if (power < powerold) // If at top of curve, change direction
{
direction = -direction;
continue;
}
if (pwm > upperbound) // If at maximum PWM, Stop here
{
pwm = upperbound;
continue;
}
if (pwm < lowerbound) // If at minimum PWM, Stop here
{
pwm = lowerbound;
continue;
}
set_pwm1_duty(pwm); // Set PWM Mark-Space Radio to approx 50%
}
}
以上就是关于求MPPT(太阳能最大功率点跟踪)扰动法算法的完整源程序,最好是基于avr编程的。全部的内容,包括:求MPPT(太阳能最大功率点跟踪)扰动法算法的完整源程序,最好是基于avr编程的。、tms320f28335 clkout的输出波形是怎样的、初学DSP书籍推荐等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)