PIC24 Support Libraries
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ledpwm.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 #include <stdio.h>
30 #include <pic24_all.h>
31 #include <dataXfer.h>
32 
33 
34 /** \file
35 Demonstrates pulse width modulation by
36 controlling the intensity of an LED. The
37 ADC input value on AN0 is used to vary the PWM
38 period.
39 */
40 
41 #ifndef PWM_PERIOD
42 #define PWM_PERIOD 20000 // desired period, in us
43 #endif
44 
45 void configTimer2(void) {
46  T2CON = T2_OFF | T2_IDLE_CON | T2_GATE_OFF
47  | T2_32BIT_MODE_OFF
48  | T2_SOURCE_INT
49  | T2_PS_1_64;
50  PR2 = usToU16Ticks(PWM_PERIOD, getTimerPrescale(T2CONbits)) - 1;
51  TMR2 = 0; //clear timer2 value
52  _T2IF = 0;
53  _T2IP = 1;
54  _T2IE = 1; //enable the Timer2 interrupt
55 }
56 
57 
58 void configOutputCompare1(void) {
59  T2CONbits.TON = 0; //disable Timer when configuring Output compare
60 #if (defined(__dsPIC33E__) || defined(__PIC24E__))
61  CONFIG_OC1_TO_RP(36); //map OC1 to RP36/RB4
62 #else
63  CONFIG_OC1_TO_RP(14); //map OC1 to RP14/RB14
64 #endif
65 //assumes TIMER2 initialized before OC1 so PRE bits are set
66  OC1RS = 0; //initially off
67 #if (defined(__dsPIC33E__) || defined(__PIC24E__))
68 //turn on the compare toggle mode using Timer2
69  OC1CON1 = OC_TIMER2_SRC | //Timer2 source
70  OC_PWM_CENTER_ALIGN; //PWM
71  OC1CON2 = 0x000C; //sync source is Timer2.
72 #else
73 //turn on the compare toggle mode using Timer2
74  OC1CON = OC_TIMER2_SRC | //Timer2 source
75  OC_PWM_FAULT_PIN_DISABLE; //PWM, no fault detection
76 #endif
77 }
78 
79 void _ISR _T2Interrupt(void) {
80  uint32_t u32_temp;
81  _T2IF = 0; //clear the timer interrupt bit
82  //update the PWM duty cycle from the ADC value
83  u32_temp = ADC1BUF0; //use 32-bit value for range
84  //compute new pulse width that is 0 to 99% of PR2
85  // pulse width (PR2) * ADC/4096
86  u32_temp = (u32_temp * (PR2))>> 12 ; // >>12 is same as divide/4096
87  OC1RS = u32_temp; //update pulse width value
88  SET_SAMP_BIT_ADC1(); //start sampling and conversion
89 }
90 
91 
92 int main(void) {
93  uint32_t u32_pw;
94 
95  // Initialize
96  configBasic(HELLO_MSG);
97  // Configure PWM
98  configTimer2();
99  configOutputCompare1();
100  CONFIG_AN0_AS_ANALOG();
101  configADC1_ManualCH0( ADC_CH0_POS_SAMPLEA_AN0, 31, 1 );
102  SET_SAMP_BIT_ADC1(); //start sampling and conversion
103  T2CONbits.TON = 1; //turn on Timer2 to start PWM
104 
105  // Report results only
106  while (1) {
107  u32_pw = ticksToUs(OC1RS, getTimerPrescale(T2CONbits));
108  printf("PWM PW (us): %ld \n", u32_pw);
109  DELAY_MS(100);
110  doHeartbeat();
111  }
112 }