- పిడబ్ల్యుఎం (పల్స్ వెడల్పు మాడ్యులేషన్)
- ARM7-LPC2148 లో PWM పిన్స్
- ARM7-LPC2148 లో PWM రిజిస్టర్లు
- భాగాలు అవసరం
- సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్లు
- Programming ARM7-LPC2148 for PWM
- Steps involved in programming LPC2148 for PWM & ADC
మనకు తెలిసినట్లుగా మైక్రోకంట్రోలర్లు అనలాగ్ సెన్సార్ల నుండి అనలాగ్ ఇన్పుట్ తీసుకొని, ఆ సంకేతాలను ప్రాసెస్ చేయడానికి ADC (అనలాగ్ టు డిజిటల్ కన్వర్టర్) ను ఉపయోగిస్తారు. సర్వో మోటర్, డిసి మోటర్ వంటి అనలాగ్ ఆపరేటెడ్ పరికరాలను నియంత్రించడానికి మైక్రోకంట్రోలర్ అనలాగ్ సిగ్నల్ను ఉత్పత్తి చేయాలనుకుంటే? మైక్రోకంట్రోలర్లు 1V, 5V వంటి అవుట్పుట్ వోల్టేజ్ను ఉత్పత్తి చేయవు, బదులుగా వారు అనలాగ్ పరికరాలను ఆపరేట్ చేయడానికి PWM అనే సాంకేతికతను ఉపయోగిస్తారు. పిడబ్ల్యుఎంకు ఉదాహరణ మా ల్యాప్టాప్ యొక్క శీతలీకరణ అభిమాని (డిసి మోటర్), ఇది ఉష్ణోగ్రత ప్రకారం వేగాన్ని నియంత్రించాల్సిన అవసరం ఉంది మరియు మదర్బోర్డులలో పల్స్ వెడల్పు మాడ్యులేషన్ (పిడబ్ల్యుఎం) పద్ధతిని ఉపయోగించడం ద్వారా ఇది అమలు చేయబడుతుంది.
ఈ ట్యుటోరియల్లో ARM7-LPC2148 మైక్రోకంట్రోలర్లో PWM ఉపయోగించి LED యొక్క ప్రకాశాన్ని నియంత్రిస్తాము.
పిడబ్ల్యుఎం (పల్స్ వెడల్పు మాడ్యులేషన్)
మోటారు వేగాన్ని నియంత్రించడం, దారితీసిన ప్రకాశం వంటి డిజిటల్ విలువను ఉపయోగించి అనలాగ్ పరికరాలను నియంత్రించడానికి PWM మంచి మార్గం. PWM స్వచ్ఛమైన అనలాగ్ అవుట్పుట్ను అందించనప్పటికీ, అనలాగ్ పరికరాలను నియంత్రించడానికి ఇది మంచి అనలాగ్ పప్పులను ఉత్పత్తి చేస్తుంది. ఫలిత తరంగం యొక్క సగటు విలువలో వైవిధ్యాన్ని పొందడానికి PWM వాస్తవానికి దీర్ఘచతురస్రాకార పల్స్ వేవ్ యొక్క వెడల్పును మాడ్యులేట్ చేస్తుంది.
PWM యొక్క విధి చక్రం
PWM సిగ్నల్ HIGH (సమయానికి) గా మిగిలి ఉన్న సమయాన్ని డ్యూటీ సైకిల్ అంటారు. సిగ్నల్ ఎల్లప్పుడూ ఆన్లో ఉంటే అది 100% డ్యూటీ సైకిల్లో ఉంటుంది మరియు ఇది ఎల్లప్పుడూ ఆఫ్లో ఉంటే అది 0% డ్యూటీ సైకిల్.
డ్యూటీ సైకిల్ = సమయం ఆన్ చేయండి / (సమయం ఆన్ చేయండి + సమయం ఆఫ్ చేయండి)
ARM7-LPC2148 లో PWM పిన్స్
క్రింద ఉన్న చిత్రం ARM7-LPC2148 యొక్క PWM అవుట్పుట్ పిన్లను సూచిస్తుంది. PWM కోసం మొత్తం ఆరు పిన్లు ఉన్నాయి.
పిడబ్ల్యుఎం ఛానల్ |
LPC2148 పోర్ట్ పిన్స్ |
పిడబ్ల్యుఎం 1 |
పి 0.0 |
పిడబ్ల్యుఎం 2 |
పి.0.7 |
పిడబ్ల్యుఎం 3 |
పి.0.1 |
పిడబ్ల్యుఎం 4 |
పి.0.8 |
పిడబ్ల్యుఎం 5 |
పి.0.21 |
పిడబ్ల్యుఎం 6 |
పి.0.9 |
ARM7-LPC2148 లో PWM రిజిస్టర్లు
మా ప్రాజెక్ట్లోకి రాకముందు ఎల్పిసి 2148 లోని పిడబ్ల్యుఎం రిజిస్టర్ల గురించి తెలుసుకోవాలి.
పిడబ్ల్యుఎం కోసం ఎల్పిసి 2148 లో ఉపయోగించిన రిజిస్టర్ల జాబితా ఇక్కడ ఉంది
1. పిడబ్ల్యుఎంపిఆర్: పిడబ్ల్యుఎం ప్రెస్కేల్ రిజిస్టర్
ఉపయోగం: ఇది 32-బిట్ రిజిస్టర్. ఇది పిడబ్ల్యుఎం టైమర్ కౌంటర్ను పెంచే ముందు పిసిఎల్కె చక్రం తప్పక ఎన్నిసార్లు (మైనస్ 1) కలిగి ఉంటుంది (ఇది వాస్తవానికి ప్రీస్కేల్ కౌంటర్ యొక్క గరిష్ట విలువను కలిగి ఉంటుంది).
2. పిడబ్ల్యుఎంపిసి: పిడబ్ల్యుఎం ప్రెస్కాలర్ కౌంటర్
ఉపయోగం: ఇది 32-బిట్ రిజిస్టర్ . ఇది పెరుగుతున్న కౌంటర్ విలువను కలిగి ఉంది. ఈ విలువ PR విలువ ప్లస్ 1 కు సమానం అయినప్పుడు, PWM టైమర్ కౌంటర్ (TC) పెంచబడుతుంది.
3. పిడబ్ల్యుఎమ్టిసిఆర్: పిడబ్ల్యుఎం టైమర్ కంట్రోల్ రిజిస్టర్
ఉపయోగం: ఇది కౌంటర్ ఎనేబుల్, కౌంటర్ రీసెట్ మరియు PWM కంట్రోల్ బిట్లను ప్రారంభిస్తుంది. ఇది 8-బిట్ రిజిస్టర్.
7: 4 |
3 |
2 |
1 |
0 |
రిజర్వ్ చేయబడింది |
PWM ఎనేబుల్ |
రిజర్వ్ చేయబడింది |
COUNTER రీసెట్ |
కౌంటర్ ఎనేబుల్ |
- PWM ప్రారంభించు: (బిట్ -3)
0- పిడబ్ల్యుఎం డిసేబుల్
1- పిడబ్ల్యుఎం ప్రారంభించబడింది
- కౌంటర్ ప్రారంభించు: (బిట్ -0)
0- కౌంటర్లను ఆపివేయి
1- కౌంటర్ను ప్రారంభించండి
- కౌంటర్ రీసెట్: (బిట్ -1)
0- ఏమీ చేయవద్దు.
1- PCLK యొక్క సానుకూల అంచున PWMTC & PWMPC ని రీసెట్ చేస్తుంది.
4. పిడబ్ల్యుఎమ్టిసి: పిడబ్ల్యుఎం టైమర్ కౌంటర్
ఉపయోగం: ఇది 32-బిట్ రిజిస్టర్. ఇది పెరుగుతున్న PWM టైమర్ యొక్క ప్రస్తుత విలువను కలిగి ఉంది. ప్రెస్కాలర్ కౌంటర్ (పిసి) ప్రెస్కాలర్ రిజిస్టర్ (పిఆర్) విలువ ప్లస్ 1 కి చేరుకున్నప్పుడు, ఈ కౌంటర్ పెరుగుతుంది.
5. పిడబ్ల్యుఎంఐఆర్: పిడబ్ల్యుఎం ఇంటరప్ట్ రిజిస్టర్
ఉపయోగం: ఇది 16-బిట్ రిజిస్టర్. ఇది PWM మ్యాచ్ ఛానెల్స్ 0-6 కోసం అంతరాయ జెండాలను కలిగి ఉంది. ఆ ఛానెల్ (MRx ఇంటరప్ట్) కోసం అంతరాయం ఏర్పడినప్పుడు అంతరాయ జెండా సెట్ చేయబడుతుంది, ఇక్కడ X అనేది ఛానెల్ సంఖ్య (0 నుండి 6 వరకు).
6. PWMMR0-PWMMR6: PWM మ్యాచ్ రిజిస్టర్
ఉపయోగం: ఇది 32-బిట్ రిజిస్టర్ . వాస్తవానికి మ్యాచ్ ఛానల్ సమూహం 6 సింగిల్-ఎడ్జ్ కంట్రోల్డ్ లేదా 3 డబుల్ ఎడ్జ్ కంట్రోల్డ్ పిడబ్ల్యుఎం అవుట్పుట్లను సెట్ చేయడానికి అనుమతిస్తుంది. PWMPCR లో మీ అవసరాలకు అనుగుణంగా ఈ PWM అవుట్పుట్లను కాన్ఫిగర్ చేయడానికి మీరు ఏడు మ్యాచ్ ఛానెల్లను సవరించవచ్చు.
7. పిడబ్ల్యుఎంఎంసిఆర్: పిడబ్ల్యుఎం మ్యాచ్ కంట్రోల్ రిజిస్టర్
ఉపయోగం: ఇది 32-బిట్ రిజిస్టర్. ఇది ఎంచుకున్న మ్యాచ్ ఛానెల్ను నియంత్రించే ఇంటరప్ట్, రీసెట్ మరియు స్టాప్ బిట్లను కలిగి ఉంటుంది. PWM మ్యాచ్ రిజిస్టర్లు మరియు PWM టైమర్ కౌంటర్ల మధ్య మ్యాచ్ జరుగుతుంది.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
రిజర్వ్ చేయబడింది |
పిడబ్ల్యుఎంఎంఆర్ 6 ఎస్ |
పిడబ్ల్యుఎంఎంఆర్ 6 ఆర్ |
PWMMR6I |
.. |
పిడబ్ల్యుఎంఎంఆర్ 1 ఎస్ |
పిడబ్ల్యుఎంఎంఆర్ 1 ఆర్ |
పిడబ్ల్యుఎంఎంఆర్ 11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
ఇక్కడ x 0 నుండి 6 వరకు ఉంటుంది
- PWMMRxI (బిట్ -0)
ఎనేబుల్ లేదా డిసేబుల్ పిడబ్ల్యుఎం అంతరాయాలు
0- PWM మ్యాచ్ అంతరాయాలను నిలిపివేయండి.
1- PWM మ్యాచ్ అంతరాయాన్ని ప్రారంభించండి.
- PWMMRxR: (బిట్ -1)
PWMTC ని రీసెట్ చేయండి - PWMRx తో సరిపోలినప్పుడల్లా టైమర్ కౌంటర్ విలువ
0- ఏమీ చేయవద్దు.
1- PWMTC ని రీసెట్ చేస్తుంది.
- PWMMRxS: (బిట్ 2)
PWMTC మ్యాచ్ రిజిస్టర్ విలువకు చేరుకున్నప్పుడు PWMTC & PWMPC ని ఆపండి
0- PWM స్టాప్ లక్షణాన్ని నిలిపివేయండి.
1- పిడబ్ల్యుఎం స్టాప్ ఫీచర్ను ప్రారంభించండి.
8. పిడబ్ల్యుఎంపిసిఆర్: పిడబ్ల్యుఎం కంట్రోల్ రిజిస్టర్
ఉపయోగం: ఇది 16-బిట్ రిజిస్టర్. ఇది PWM అవుట్పుట్లను 0-6 ఎనేబుల్ చేసే బిట్లను కలిగి ఉంటుంది మరియు ప్రతి అవుట్పుట్కు సింగిల్-ఎడ్జ్ లేదా డబుల్ ఎడ్జ్ నియంత్రణను ఎంచుకోండి.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
ఉపయోగించబడలేదు |
PWMENA6-PWMENA1 |
ఉపయోగించబడలేదు |
PWMSEL6-PWMSEL2 |
ఉపయోగించబడలేదు |
- PWMSELx (x: 2 నుండి 6 వరకు)
- PWMx కోసం సింగిల్ ఎడ్జ్ మోడ్
- 1- పిడబ్ల్యుఎంఎక్స్ కోసం డబుల్ ఎడ్జ్ మోడ్.
- PWMENAx (x: 1 నుండి 6 వరకు)
- PWMx ఆపివేయి.
- 1- పిడబ్ల్యుఎంఎక్స్ ప్రారంభించబడింది.
9. PWMLER: PWM లాచ్ రిజిస్టర్ను ప్రారంభించండి
ఉపయోగం: ఇది 8-బిట్ రిజిస్టర్. ఇది ప్రతి మ్యాచ్ ఛానెల్కు మ్యాచ్ x లాచ్ బిట్లను కలిగి ఉంటుంది.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
ఉపయోగించబడలేదు |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 నుండి 6 వరకు):
0- క్రొత్త మ్యాచ్ విలువలను లోడ్ చేయడాన్ని ఆపివేయి
1- టైమర్ రీసెట్ అయినప్పుడు (PWMMRx) PWMMatch రిజిస్టర్ నుండి కొత్త మ్యాచ్ విలువలను లోడ్ చేయండి.
ఇప్పుడు ARM మైక్రోకంట్రోలర్లో పల్స్ వెడల్పు మాడ్యులేషన్ను ప్రదర్శించడానికి హార్డ్వేర్ సెటప్ను నిర్మించడం ప్రారంభిద్దాం.
భాగాలు అవసరం
హార్డ్వేర్
- ARM7-LPC2148 మైక్రోకంట్రోలర్
- 3.3 వి వోల్టేజ్ రెగ్యులేటర్ ఐసి
- 10 కె పొటెన్టోమీటర్
- LED (ఏదైనా రంగు)
- LCD (16x2) డిస్ప్లే మాడ్యూల్
- బ్రెడ్బోర్డ్
- వైర్లను కనెక్ట్ చేస్తోంది
సాఫ్ట్వేర్
- కైల్ uVision5
- ఫ్లాష్ మ్యాజిక్ సాధనం
సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్లు
Connections between LCD & ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Register Select) |
P0.6 |
E (Enable) |
P0.12 |
D4 (Data pin 4) |
P0.13 |
D5(Data pin 5) |
P0.14 |
D6(Data pin 6) |
P0.15 |
D7 (Data pin 7) |
GND |
VSS, R/W,K |
+5V |
VDD,A |
Connection between LED & ARM7-LPC2148
LED’s ANODE is connected to the PWM output (P0.0) of LPC2148, while LED’s CATHODE pin is connected to GND pin of LPC2148.
Connection between ARM7-LPC2148 and potentiometer with 3.3V voltage regulator
3.3V Voltage Regulator IC |
Pin function |
ARM-7 LPC2148 Pin |
1.Left Pin |
- Ve from GND |
GND pin |
2.Centre Pin |
Regulated +3.3V Output |
To potentiometer Input and potentiometer’s output to P0.28 of LPC2148 |
3.Right Pin |
+ Ve from 5V INPUT |
+5V |
Points to be noted
1. A voltage regulator of 3.3V is used here to provide analog input value to the ADC pin (P0.28) of LPC2148 and because we are using 5V power we need to regulate voltage with voltage regulator of 3.3V.
2. A Potentiometer is used to vary voltage between (0V to 3.3V) to provide analog input (ADC) to LPC2148 pin P0.28
Programming ARM7-LPC2148 for PWM
To Program ARM7-LPC2148 we need keil uVision & Flash Magic tool. We are using USB Cable to program ARM7 Stick via micro USB port. We write code using Keil and create a hex file and then the HEX file is flashed to ARM7 stick using Flash Magic. To know more about installing keil uVision and Flash Magic and how to use them follow the link Getting Started With ARM7 LPC2148 Microcontroller and Program it using Keil uVision.
In this tutorial we will use ADC and PWM technique to control the brightness of the LED. Here LPC2148 is given analog input (0 to 3.3V) via ADC input pin P0.28, then this analog input is converted into digital value (0 to 1023). Then this value is again converted into digital value (0 - 255) as PWM output of LPC2148 has only 8-bit resolution (28). LED is connected to PWM pin P0.0 and the brightness of the LED can be controlled using the potentiometer. To know more about ADC in ARM7-LPC2148 follow the link.
Steps involved in programming LPC2148 for PWM & ADC
Step 1:- The very first thing is to configure the PLL for clock generation as it sets the system clock and peripheral clock of LPC2148 as per programmers need. The maximum clock frequency for LPC2148 is 60Mhz. Following lines are used to configure PLL clock generation.
void initilizePLL (void) //Function to use PLL for clock generation { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while(!(PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Step 2:- Next thing is to select the PWM pins and PWM function of LPC2148 by using PINSEL register. We use PINSEL0 as we use P0.0 for PWM output of LPC2148.
PINSEL0 = 0x00000002; //Setting pin P0.0 for PWM output
Step 3:- Next we need to RESET the timers using PWMTCR (Timer Control Register).
PWMTCR = (1<<1); //Setting PWM Timer Control Register as counter reset
And then, set the prescale value which decides the resolution of PWM. I’m setting it to zero
PWMPR = 0X00; //Setting PWM prescale value
Step 4:- Next we need to set the PWMMCR (PWM match control register) as it sets operation like reset, interrupts for PWMMR0.
PWMMCR = (1<<0)-(1<<1); //Setting PWM Match Control Register
Step 5:- The maximum period of the PWM channel is set using PWMMR.
PWMMR0 = PWMvalue; //Giving PWM value Maximum value
In our case the maximum value is 255 (For maximum brightness)
Step 6:- Next we need to set the Latch Enable to the corresponding match registers using PWMLER
PWMLER = (1<<0); //Enalbe PWM latch
(We use PWMMR0) So enable the corresponding bit by setting 1 in PWMLER
Step 7:- To enable the PWM output to the pin we need to use the PWMTCR for enabling the PWM Timer counters and PWM modes.
PWMTCR = (1<<0) - (1<<3); //Enabling PWM and PWM counter
Step 8:- Now we need to get the potentiometer values for setting duty cycle of PWM from ADC pin P0.28. So we use ADC module in LPC2148 for converting potentiometers analog input (0 to 3.3V) to the ADC values (0 to 1023).
Here we are converting the values from 0-1023 to 0-255 by dividing it with 4 as PWM of LPC2148 has 8-Bit resolution (28).
Step 9:- For selecting ADC pin P0.28 in LPC2148, we use
PINSEL1 = 0x01000000; //Setting P0.28 as ADC INPUT AD0CR = (((14)<<8) - (1<<21)); //Setting clock and PDN for A/D Conversion
The following lines capture the Analog input (0 to 3.3V) and convert it into digital value (0 to 1023). And then this digital values are divided by 4 to convert them into (0 to 255) and finally fed as PWM output in P0.0 pin of LPC2148 on which the LED is connected.
AD0CR -= (1<<1); //Select AD0.1 channel in ADC register delaytime(10); AD0CR -= (1<<24); //Start the A/D conversion while((AD0DR1 & (1<<31)) == 0); //Check the DONE bit in ADC Data register adcvalue = (AD0DR1>>6) & 0x3ff; //Get the RESULT from ADC data register dutycycle = adcvalue/4; //formula to get dutycycle values from (0 to 255) PWMMR1 = dutycycle; //set dutycycle value to PWM match register PWMLER -= (1<<1); //Enable PWM output with dutycycle value
Step 10:- Next we display those values in the LCD (16X2) Display module. So we add the following lines to initializes LCD display module
Void LCD_INITILIZE(void) //Function to get ready the LCD { IO0DIR = 0x0000FFF0; //Sets pin P0.12,P0.13,P0.14,P0.15,P0.4,P0.6 as OUTPUT delaytime(20); LCD_SEND(0x02); // Initialize lcd in 4-bit mode of operation LCD_SEND(0x28); // 2 lines (16X2) LCD_SEND(0x0C); // Display on cursor off LCD_SEND(0x06); // Auto increment cursor LCD_SEND(0x01); // Display clear LCD_SEND(0x80); // First line first position }
As we connected LCD in 4-Bit mode with LPC2148 we need to send values to be displayed as nibble by nibble (Upper Nibble & Lower Nibble). So following lines are used.
void LCD_DISPLAY (char* msg) //Function to print the characters sent one by one { uint8_t i=0; while(msg!=0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0)<<8)); //Sends Upper nibble IO0SET = 0x00000050; //RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; //RW LOW Write mode delaytime(2); IO0CLR = 0x00000040; // EN = 0, RS and RW unchanged(i.e. RS = 1, RW = 0) delaytime(5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F)<<12)); //Sends Lower nibble IO0SET = 0x00000050; //RS & EN HIGH IO0CLR = 0x00000020; delaytime(2); IO0CLR = 0x00000040; delaytime(5); i++; } }
ఆ ADC & PWM విలువలను ప్రదర్శించడానికి మేము int main () ఫంక్షన్లో ఈ క్రింది పంక్తులను ఉపయోగిస్తాము.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // ADC విలువను ప్రదర్శించు (0 నుండి 1023 వరకు) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", ప్రకాశం); LCD_DISPLAY (ledoutput); // డ్యూటీసైకిల్ విలువలను ప్రదర్శించండి (0 నుండి 255 వరకు)
ట్యుటోరియల్ యొక్క పూర్తి కోడ్ మరియు వీడియో వివరణ క్రింద ఇవ్వబడ్డాయి.