Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
WAT IS PWM?
PWM STAAT VOOR PULSE WIDTH MODULATION is een techniek waarbij de breedte van de puls wordt gevarieerd.
Om dit concept duidelijk te begrijpen, moet u een klokpuls of een blokgolfsignaal duidelijk overwegen, het heeft een werkcyclus van 50%, wat betekent dat de Ton- en Toff-periode hetzelfde is. De totale duur waarvoor het signaal hoog was en de duur waarvoor het signaal laag was, wordt totaal genoemd tijdsperiode.
Voor de afbeelding hierboven heeft deze golf een duty cycle van 50%
Inschakelduur = (AAN-tijd / totale tijd) * 100
AAN-tijd - tijd waarvoor het signaal hoog was
UIT-tijd - tijd vijand welk signaal laag was Totale tijd - Totale tijdsperiode van de puls (zowel AAN- als UIT-tijd)
Stap 1: Microcontroller selecteren
Het selecteren van de juiste microcontroller voor het project, dit is het essentiële onderdeel van het project. PWM-signalen kunnen worden gegenereerd in microcontrollers met PWM-kanalen (CCP-registers). Voor dit project ben ik van plan om bij pic16f877 te blijven. u kunt de datasheet-link hieronder downloaden:
PIC16F877a gegevensblad klik hier:
CCP-module is verantwoordelijk voor het produceren van het PWM-signaal. CCP1 en CCP2 zijn gemultiplext met PORTC. PORTC is een 8-bit brede bidirectionele poort. Het bijbehorende gegevensrichtingsregister is TRISC. Als u TRISC-bit (=1) instelt, wordt de corresponderende PORTC-pin als invoer genomen. Als u een TRISC-bit(=0) wist, wordt de bijbehorende PORTC-pin een uitvoer.
TRISC = 0; // Als u dit bit wist, wordt PORTC als uitvoer gemaakt
Stap 2: CONFIGUREER CCP-MODULE
CCP - CAPTURE/VERGELIJK/PWM-MODULES
Elke Capture/Compare/PWM (CCP) module bevat een 16-bits register dat kan werken als een:
• 16-bits opnameregister
• 16-bits vergelijkingsregister
• PWM Master/Slave Duty Cycle-register
Configureer het CCP1CON-register in de PWM-modus
Registreren Beschrijving
CCPxCON Dit register wordt gebruikt om de CCP-module te configureren voor Capture/Compare/PWM-bediening.
CCPRxL Dit register bevat de 8-Msb-bits van PWM, lagere 2-bits zullen deel uitmaken van het CCPxCON-register.
TMR2 Vrijlopende teller die wordt vergeleken met CCPR1L en PR2 voor het genereren van de PWM-uitgang.
Nu zal ik binair gebruiken om de bits weer te geven om het CCP1CON-register te configureren.
zie de afbeelding hierboven.
CCP1CON = 0b00001111;
Je kunt ook je hex-formaat gebruiken
CCP1CON = 0x0F; // CCP1CON-register configureren voor PWM-modus
Stap 3: Timer2-module configureren (TMR2-register)
Timer2 is een 8-bits timer met een prescaler en een postscaler. Het kan worden gebruikt als de PWM-tijdbasis voor de PWM-modus van de CCP-module(s). Het TMR2-register is leesbaar en beschrijfbaar en wordt gewist op elk apparaat Reset.
T2CON-register wordt weergegeven
De prescale en postscale passen de uitgangsfrequentie van de gegenereerde PWM-golf aan.
Frequentie = klokfrequentie/(4*prescaler*(PR2-TMR2)*Postscaler*count)
Waar Tout = 1/frequentie
T2CON = 0b00000100;
Dit genereert 2,5 KHz @ 1 Mhz of 100 KHz @ 4 MHz kristal (praktisch is er een beperking voor deze PWM-frequentie, raadpleeg de specifieke datasheet voor meer details)
hex representatie
T2CON = 0x04; // schakel T2CON in zonder configuratie voor prescaler en postscale
Stap 4: PR2 configureren (Timer2-perioderegister)
De Timer2-module heeft een 8-bits perioderegister, PR2. Timer2 neemt toe vanaf 00h totdat deze overeenkomt met PR2 en wordt dan teruggezet naar 00h bij de volgende incrementcyclus. PR2 is een leesbaar en beschrijfbaar register. Het PR2-register wordt bij Reset geïnitialiseerd op FFh.
Door een geschikt bereik voor PR2 in te stellen, kan de werkcyclus van de gegenereerde PWM-golf worden gewijzigd
PR2 = 100; // Stel de Cyclustijd in op 100 voor het variëren van de werkcyclus van 0-100
Voor de eenvoud gebruik ik PR2=100 door CCPR1L = 80 te maken; 80% inschakelduur kan worden bereikt.
Stap 5: CCPR1l-module configureren
Aangezien PR2 = 100 CCPR1l overal tussen 0-100 kan worden geconfigureerd om de gewenste inschakelduur te krijgen.
Stap 6: Schrijf de schets op je MPLAB X IDE de code wordt hieronder gegeven
#erbij betrekken
void delay (int a) // functie om vertraging te genereren{
for(int i=0; i<a;i++)
{
for(int j=0;j<144;j++);
}
}
ongeldig hoofd()
{TRISC = 0; // Als u dit bit wist, wordt PORTC als uitvoer gemaakt.
CCP1CON = 0x0F; // CCP1CON-register configureren voor PWM-modus
T2CON = 0x04; // schakel T2CON in zonder configuratie voor prescaler en postscale.
PR2 = 100; // Stel de Cyclustijd in op 100 voor het variëren van de werkcyclus van 0-100
terwijl(1){
CCPR1L = 75; //gegenereerde 75% inschakelduurvertraging(1);
}
}
Ik heb ook een kleine wijziging in de code aangebracht, zodat de frequentie van de gegenereerde PWM-golf
Dit is code die wordt gesimuleerd in proteus en de output PWM-golf wordt hieronder weergegeven. Om dit op uw pic-ontwikkelingsborden te uploaden, gebruikt u #include met geschikte configuratiebits.
Bedankt