首页 一份正玄波源程序

一份正玄波源程序

举报
开通vip

一份正玄波源程序/***************************************************************************** /***************************************************************************** * Filename: MAIN.C ****************************************************************************** * * ...

一份正玄波源程序
/***************************************************************************** /***************************************************************************** * Filename: MAIN.C ****************************************************************************** * * Author: Dave Karipides * Company: APS, Inc. * Date: 3-3-97 * Compiled Using MPLAB-C Rev 1.21 * ****************************************************************************** ****************************************************************************** * * Description: The main routine calls all the functions for generating * an OPEN_LOOP or FEEDBACK sine wave of either 50 or 60 Hz. * ****************************************************************************** * * * ******************************************************************************/ /***************************************************************************** * main() * * Description: The main routine initializes the registers and loops * forever.  All control is handled in the TMR0 INT * routine. * * * Input Variables: NONE * * Output Variables: NONE * * ******************************************************************************/ //#define OPEN_LOOP #define FEEDBACK //#define 50Hz #define 60Hz #pragma option v #include <17c43.h> #include #include #ifdef OPEN_LOOP // This table yields Full VRMS input unsigned char const pwmtab[32]={0,25,50,74,98,120,142,162,180,197,212, 225,235,244,250,254,255,254,250,244,235, 225,212,197,180,162,142,120,98,74,50,25}; #endif #ifdef FEEDBACK // This table yields slightly less than Full VRMS input unsigned char const pwmtab[32]={0,20,40,60,79,97,114,131,145,159,171, 181,189,197,202,205,206,205,202,197,189, 181,171,159,145,131,114,97,79,60,40,20}; #endif long read_ad(unsigned char); // Prototype for A/D converter function unsigned char index; // Index into the sinewave reference table unsigned char sign; // Flag used to unfold sinewave reference table long reference; // Value of the sinewave refrence after unfolding unsigned char reference_lo  @ reference; // V1.21 of Compiler does not type cast unsigned // char to long so we will write to low byte separately long out_volt; // Magnitude of the output voltage; long y; // Variables used in compensation routine long yold; long x; long xold; long ad_value; // A/D Converter Value void main(void) { CLRWDT(); PORTC = 0; // Zero out portc latches DDRC = 0x22; // Set up Data direction register for C DDRB = 0; // Set up Data direction register for B PR1 = 0xFF; // Setup PR1 register (24.4Khz @ 25Mhz clk) PW1DCL = 0; // Set low bits of PWM to 0 PW1DCH = 0; // Init PWM duty cycle to 0 T0STA = 0x20; // Configure Timer0 prescaler INTSTA.T0IE = 1; // Enable Timer 0 interrupt TCON1.TMR1CS = 0; TCON1.T16 = 0; TCON2.TMR1ON = 1; // Start timer 1 (PWM timer) TCON2.PWM1ON = 1; // Turn on the PWM CPUSTA.GLINTD = 0; // Unmask the interrupts index = 0; // Initialize variables sign = 0; y = 0; yold = 0; x = 0; xold = 0; PORTC.0 = 1; // Enable the Inverter while(1); // Loop forever, execute in INT Routine } #ifdef FEEDBACK __TMR0() // Timer  interrupt { T0STA.T0CS = 0; // Stop timer PORTB.7=1; #ifdef 60Hz TMR0L=0xA5; TMR0H=0xF9; // Make Timer0 interrupt at 3.84KHz for 60Hz output #endif #ifdef 50Hz TMR0L=0x5F; // Make Timer0 interrupt at 3.20KHz for 50Hz output TMR0H=0xF8; #endif T0STA.T0CS = 1; // Start timer CLRWDT(); reference = 0; // Clear Reference Value reference_lo = pwmtab[index]; // Lookup the value of the sinewave reference if (!index) // Toggle Sign Every Cycle Through table sign = ~sign; ++index; // Increment index if (index == 32) // If end of table, reset counter index = 0; if (sign) // If negative going wave { reference = ~reference; // V1.21 of Compiler negate (-ref) doesn't work for reference = reference + 1;// ref<=0 } ad_value = read_ad(0); out_volt = ad_value - 512; // Read output voltage (512 counts=0 volts out) // Form the expression y = yold + (0.09261 * (x + xold)) // Where yold, xold is the value of y, x from the previous sample // x is the , formed by the difference between the output // of the inverter and the reference signal. x = out_volt - reference; y = ((x + xold) * 24); y = y / 256; y = y + yold; if (y >= 0) { PORTC.2 = 0; // Set positive going cycle } else { PORTC.2 = 1; // Set negative going cycle y = ~y; y = y + 1; } if (y > 255) y = 255; // Limit y PW1DCH = y; // Update duty cycle xold = x; // Store previous sample's state yold = y; PORTB.7=0; } #endif #ifdef OPEN_LOOP // The inverter runs in an open loop mode with OPEN_LOOP defined. __TMR0() // Timer interrupt { T0STA.T0CS = 0; // Stop timer #ifdef 60Hz TMR0L=0xA5; TMR0H=0xF9; //Make Timer0 interrupt at 3.84KHz for 60Hz output #endif #ifdef 50Hz TMR0L=0x5F; //Make Timer0 interrupt at 3.20KHz for 50Hz output TMR0H=0xF8; #endif T0STA.T0CS=1; //Start timer CLRWDT(); PW1DCH = pwmtab[index]; if (!index) { PORTC.0 = 0; // Gate Drive off PORTC.2 = ~PORTC.2; // Flip Pos/Neg bit PORTC.0 = 1; // Gate Drive on } ++index; if (index == 32) index = 0; PORTC.3 = ~PORTC.3; // Toggle bit to test freq. } #endif long read_ad(unsigned char channel) { long result; PORTC.6 = 1; // Write bit high PORTC.7 = 1; // Read bit high PORTC.4 = 1; // Chip select high DDRD = 0; // Make PORTD an output PORTD = 0x04; // Single ended mode signed 10 bit chan 0 Right justified PORTC.4 = 0; // Select chip PORTC.6 = 0; // latch command word int A/D PORTC.6 = 1; // Start conversion PORTC.4 = 1; // Deselect chip while (PORTC.5); // Wait for conversion to complete DDRD = 0xFF; // Make PORTD an input PORTC.4 = 0; // Select chip PORTC.7 = 0; // Read high byte *( ((unsigned char*)&result) + 1) = PORTD; PORTC.7 = 1; PORTC.4 = 1; PORTC.4 = 0; PORTC.7 = 0; // Read low byte *( ((unsigned char*)&result) ) = PORTD; PORTC.7 = 1; PORTC.4 = 1; // Reset chip select lines return (result); // Return data } 回复1帖 2帖  zack团长  834 2006-04-24 23:53 转帖海魄兄的话: 各位朋友,我以前在交友\同僚转帖过一个网友讲的故事,希望在这里再次提起,希望能给我们启发,在以前的北美洲,送牛奶的把灌满牛奶的奶瓶放到到每家订牛奶的客户家的收牛奶的地方以后,经常会有两种鸟来偷食,其中一种是红嘴鸟,一种是麻雀.后来送牛奶的人就想了个 办法 鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载 ,把灌满牛奶的瓶口用锡箔包上,这样就不会被鸟偷食了.可是过了几年以后,麻雀就用嘴把锡箔弄破了继续偷吃牛奶.而红嘴鸟至今还无法偷吃到牛奶.为什么麻雀可以而红嘴鸟不可以呢?有关研究人员对这个现象进行了研究,结论是,因为麻雀是群居,偶尔有一只发现了可以有新的办法吃到牛奶就会告诉其它麻雀,而红嘴鸟却不是,每个个体都是单独行动.我希望我们在国内从事UPS的技术人员能够从这个小的故事得到启发,来到这里的每位朋友不论资历高底,希望大家能真正的从技术角度出发,共同交流共同学习,共同促进,那样才能缩短我们和国外的技术差距. 这份源代码希望大家提出看法,我的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 基本上源自此处. I hope the inverter field R&Ds in our country can get help from this code  and become more and more experience and skills in MCU software design. I hope our engineers would have more and more creativity,not just except copy there is olny copy!
本文档为【一份正玄波源程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_852152
暂无简介~
格式:doc
大小:34KB
软件:Word
页数:0
分类:互联网
上传时间:2013-12-27
浏览量:20