PIC24 Support Libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ledpwm_pic24f.c
Go to the documentation of this file.
1 /*
2  * "Copyright (c) 2008 Robert B. Reese, Bryan A. Jones, J. W. Bruce ("AUTHORS")"
3  * All rights reserved.
4  * (R. Reese, reese_AT_ece.msstate.edu, Mississippi State University)
5  * (B. A. Jones, bjones_AT_ece.msstate.edu, Mississippi State University)
6  * (J. W. Bruce, jwbruce_AT_ece.msstate.edu, Mississippi State University)
7  *
8  * Permission to use, copy, modify, and distribute this software and its
9  * documentation for any purpose, without fee, and without written agreement is
10  * hereby granted, provided that the above copyright notice, the following
11  * two paragraphs and the authors appear in all copies of this software.
12  *
13  * IN NO EVENT SHALL THE "AUTHORS" BE LIABLE TO ANY PARTY FOR
14  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
15  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE "AUTHORS"
16  * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17  *
18  * THE "AUTHORS" SPECIFICALLY DISCLAIMS ANY WARRANTIES,
19  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20  * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE "AUTHORS" HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
23  *
24  * Please maintain this header in its entirety when copying/modifying
25  * these files.
26  *
27  *
28  */
29 
30 #include "pic24_all.h"
31 #include <stdio.h>
32 
33 /** \file
34 Demonstrates pulse width modulation by
35 controlling the intensity of an LED. The
36 ADC input value on AN0 is used to vary the PWM
37 period.
38 This projects uses an external crystal for accuracy.
39 CLOCK_CONFIG=PRIPLL_8MHzCrystal_40MHzFCY is defined in the MPLAB project.
40 Remove this macro if you wish to use the internal oscillator.
41 */
42 
43 #ifndef PWM_PERIOD
44 #define PWM_PERIOD 20000 // desired period, in us
45 #endif
46 
47 void configTimer2(void) {
48  T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
49  | T2_32BIT_MODE_OFF
50  | T2_SOURCE_INT
51  | T2_PS_1_64 ; //1 tick = 1.6 us at FCY=40 MHz
52  PR2 = usToU16Ticks(PWM_PERIOD, getTimerPrescale(T2CONbits)) - 1;
53  TMR2 = 0; //clear timer2 value
54  _T2IF = 0;
55  _T2IP = 1;
56  _T2IE = 1; //enable the Timer2 interrupt
57 }
58 
59 
60 void configOutputCompare1(void) {
61  T2CONbits.TON = 0; //disable Timer when configuring Output compare
62  CONFIG_OC1_TO_RP(14); //map OC1 to RP14/RB14
63 //assumes TIMER2 initialized before OC1 so PRE bits are set
64  OC1RS = 0; //initially off
65 //turn on the compare toggle mode using Timer2
66  OC1CON = OC_TIMER2_SRC | //Timer2 source
67  OC_PWM_FAULT_PIN_DISABLE; //PWM, no fault detection
68 }
69 
70 void _ISR _T2Interrupt(void) {
71  uint32_t u32_temp;
72  _T2IF = 0; //clear the timer interrupt bit
73  //update the PWM duty cycle from the ADC value
74  u32_temp = ADC1BUF0; //use 32-bit value for range
75  //compute new pulse width that is 0 to 99% of PR2
76  // pulse width (PR2) * ADC/1024
77  u32_temp = (u32_temp * (PR2))>> 10 ; // >>10 is same as divide/1024
78  OC1RS = u32_temp; //update pulse width value
79  SET_SAMP_BIT_ADC1(); //start sampling and conversion
80 }
81 
82 int main(void) {
83  uint32_t u32_pw;
84  configBasic(HELLO_MSG);
85  configTimer2();
86  configOutputCompare1();
87  CONFIG_AN0_AS_ANALOG();
88  configADC1_ManualCH0( ADC_CH0_POS_SAMPLEA_AN0, 2, 0 );
89  SET_SAMP_BIT_ADC1(); //start sampling and conversion
90  T2CONbits.TON = 1; //turn on Timer2 to start PWM
91  while (1) {
92  u32_pw= ticksToUs(OC1RS, getTimerPrescale(T2CONbits));
93  printf("PWM PW (us): %ld \n",u32_pw);
94  DELAY_MS(100);
95  doHeartbeat();
96  }
97 }