00001 /* 00002 * "Copyright (c) 2008 Robert B. Reese, Bryan A. Jones, J. W. Bruce ("AUTHORS")" 00003 * All rights reserved. 00004 * (R. Reese, reese_AT_ece.msstate.edu, Mississippi State University) 00005 * (B. A. Jones, bjones_AT_ece.msstate.edu, Mississippi State University) 00006 * (J. W. Bruce, jwbruce_AT_ece.msstate.edu, Mississippi State University) 00007 * 00008 * Permission to use, copy, modify, and distribute this software and its 00009 * documentation for any purpose, without fee, and without written agreement is 00010 * hereby granted, provided that the above copyright notice, the following 00011 * two paragraphs and the authors appear in all copies of this software. 00012 * 00013 * IN NO EVENT SHALL THE "AUTHORS" BE LIABLE TO ANY PARTY FOR 00014 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT 00015 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE "AUTHORS" 00016 * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00017 * 00018 * THE "AUTHORS" SPECIFICALLY DISCLAIMS ANY WARRANTIES, 00019 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 00020 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 00021 * ON AN "AS IS" BASIS, AND THE "AUTHORS" HAS NO OBLIGATION TO 00022 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." 00023 * 00024 * Please maintain this header in its entirety when copying/modifying 00025 * these files. 00026 * 00027 * 00028 */ 00029 #include "pic24_all.h" 00030 #include <stdio.h> 00031 00045 #ifndef PWM_PERIOD 00046 #define PWM_PERIOD 500 // desired period, in us 00047 #endif 00048 00049 void configTimer2(void) { 00050 T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF 00051 | T2_32BIT_MODE_OFF 00052 | T2_SOURCE_INT 00053 | T2_PS_1_64 ; //1 tick = 1.6 us at FCY=40 MHz 00054 PR2 = usToU16Ticks(PWM_PERIOD, getTimerPrescale(T2CONbits)); 00055 TMR2 = 0; //clear timer2 value 00056 _T2IF = 0; 00057 _T2IP = 1; 00058 _T2IE = 1; //enable the Timer2 interrupt 00059 } 00060 00061 void configOutputCapture1(void) { 00062 T2CONbits.TON = 0; //disable Timer when configuring Output compare 00063 CONFIG_RB3_AS_DIG_OUTPUT(); 00064 CONFIG_OC1_TO_RP(3); //map OC1 to RP3/RB3 00065 //assumes TIMER2 initialized before OC1 so PRE bits are set 00066 OC1RS = 0; //initially off 00067 //turn on the compare toggle mode using Timer2 00068 OC1CON = OC_TIMER2_SRC | //Timer2 source 00069 OC_PWM_FAULT_PIN_DISABLE; //PWM, no fault detection 00070 } 00071 00072 volatile uint8 u8_updateFlag = 0; 00073 volatile uint16 u16_newOC1RS; 00074 00075 void _ISR _T2Interrupt(void) { 00076 _T2IF = 0; //clear the timer interrupt bit 00077 if (u8_updateFlag) { 00078 OC1RS = u16_newOC1RS; //update pulse width value 00079 u8_updateFlag = 0; 00080 _LATB9 = 1; 00081 DELAY_US(1); 00082 _LATB9 = 0; 00083 } 00084 } 00085 00086 char sz1[32]; 00087 00088 int main(void) { 00089 uint16 u16_mv; 00090 float f_tmp; 00091 configBasic(HELLO_MSG); 00092 CONFIG_RB9_AS_DIG_OUTPUT(); 00093 _LATB9 = 0; 00094 configTimer2(); 00095 configOutputCapture1(); 00096 T2CONbits.TON = 1; //turn on Timer2 to start PWM 00097 while (1) { 00098 outString("Input voltage 0 to 3300 (mv): \n"); 00099 inStringEcho(sz1,30); 00100 sscanf(sz1,"%d",(int *) &u16_mv); 00101 f_tmp = u16_mv; 00102 f_tmp = f_tmp/3300 * PR2; 00103 u16_newOC1RS = f_tmp; 00104 u8_updateFlag = 1; 00105 } 00106 }