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