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 00030 #include "pic24_all.h" 00031 #include <stdio.h> 00032 00043 #ifndef PWM_PERIOD 00044 #define PWM_PERIOD 20000 // desired period, in us 00045 #endif 00046 00047 void configTimer2(void) { 00048 T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF 00049 | T2_32BIT_MODE_OFF 00050 | T2_SOURCE_INT 00051 | T2_PS_1_64 ; //1 tick = 1.6 us at FCY=40 MHz 00052 PR2 = usToU16Ticks(PWM_PERIOD, getTimerPrescale(T2CONbits)) - 1; 00053 TMR2 = 0; //clear timer2 value 00054 _T2IF = 0; 00055 _T2IP = 1; 00056 _T2IE = 1; //enable the Timer2 interrupt 00057 } 00058 00059 00060 void configOutputCapture1(void) { 00061 T2CONbits.TON = 0; //disable Timer when configuring Output compare 00062 CONFIG_OC1_TO_RP(14); //map OC1 to RP14/RB14 00063 //assumes TIMER2 initialized before OC1 so PRE bits are set 00064 OC1RS = 0; //initially off 00065 //turn on the compare toggle mode using Timer2 00066 OC1CON = OC_TIMER2_SRC | //Timer2 source 00067 OC_PWM_FAULT_PIN_DISABLE; //PWM, no fault detection 00068 } 00069 00070 void _ISR _T2Interrupt(void) { 00071 uint32 u32_temp; 00072 _T2IF = 0; //clear the timer interrupt bit 00073 //update the PWM duty cycle from the ADC value 00074 u32_temp = ADC1BUF0; //use 32-bit value for range 00075 //compute new pulse width that is 0 to 99% of PR2 00076 // pulse width (PR2) * ADC/1024 00077 u32_temp = (u32_temp * (PR2))>> 10 ; // >>10 is same as divide/1024 00078 OC1RS = u32_temp; //update pulse width value 00079 SET_SAMP_BIT_ADC1(); //start sampling and conversion 00080 } 00081 00082 int main(void) { 00083 uint32 u32_pw; 00084 configBasic(HELLO_MSG); 00085 configTimer2(); 00086 configOutputCapture1(); 00087 CONFIG_AN0_AS_ANALOG(); 00088 configADC1_ManualCH0( ADC_CH0_POS_SAMPLEA_AN0, 2, 0 ); 00089 SET_SAMP_BIT_ADC1(); //start sampling and conversion 00090 T2CONbits.TON = 1; //turn on Timer2 to start PWM 00091 while (1) { 00092 u32_pw= ticksToUs(OC1RS, getTimerPrescale(T2CONbits)); 00093 printf("PWM PW (us): %ld \n",u32_pw); 00094 DELAY_MS(100); 00095 doHeartbeat(); 00096 } 00097 }