fråga om PWM + 16f690
Postat: 12 februari 2011, 16:53:45
Jag har en fråga angående PWM-modulen i PIC16f690. Koden längst ner generar en 5kHz signal.
Jag försöker ställa Duty Cycle till olika värden och detta fungerar om jag gör en evig loop och sätter godtyckligt värde (mellan 0-100) på CCPR1L. Men jag skulle vilja undvika den eviga loopen, och bara sätta CCPR1L= ett visst värde; överst i programmet. Men då får jag ingen signal på utgången (mäter med oscilloskop). Jag antar att jag inte ska behöva uppdatera CCPR1L hela tiden?
För att förtydliga så är den enda ändringen jag gör i programmet:
Detta ger en signal med 50% Duty Cycle
Om jag tar bort loopen och bara skriver
Jag försöker ställa Duty Cycle till olika värden och detta fungerar om jag gör en evig loop och sätter godtyckligt värde (mellan 0-100) på CCPR1L. Men jag skulle vilja undvika den eviga loopen, och bara sätta CCPR1L= ett visst värde; överst i programmet. Men då får jag ingen signal på utgången (mäter med oscilloskop). Jag antar att jag inte ska behöva uppdatera CCPR1L hela tiden?
För att förtydliga så är den enda ändringen jag gör i programmet:
Detta ger en signal med 50% Duty Cycle
Kod: Markera allt
for(;;) {
CCPR1L=50;
}
Om jag tar bort loopen och bara skriver
Kod: Markera allt
CCPR1L=50;
Kod: Markera allt
så får jag ingen signal.
#include <pic.h>
/* PIC Configuration Bit:
** INTIO - Using Internal RC No Clock
** WDTDIS - Wacthdog Timer Disable
** PWRTEN - Power Up Timer Enable
** MCLREN - Master Clear Enable
** UNPROTECT - Code Un-Protect
** UNPROTECT - Data EEPROM Read Un-Protect
** BORDIS - Borwn Out Detect Disable
** IESODIS - Internal External Switch Over Mode Disable
** FCMDIS - Monitor Clock Fail Safe Disable
*/
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT \
& UNPROTECT & BORDIS & IESODIS & FCMDIS);
// Using Internal Clock of 8 MHz
#define FOSC 8000000L
void main(void)
{
OSCCON=0x70; // Select 8 MHz internal clock
TRISC = 0x00; // Set All on PORTC as Output
ANSEL = 0x00; // Set PORT AN0 to AN7 digital I/O
ANSELH = 0x00; // Set PORT AN8 to AN11 as Digital I/O
PORTC = 0x00; // Turn Off all PORTC
/* Init PWM for Single Output */
CCP1CON=0b00001100; // Single PWM mode; P1A, P1C active-high; P1B, P1D active-high
CCPR1L=0; // Start with zero Duty Cycle
T2CON=0b00000101; // Postscale: 1:1, Timer2=On, Prescale = 1:4
PR2=0x65; // Frequency: 4.90 kHz/PR2=0x65;
TMR2=0; // Start with zero Counter
PSTRCON=0b00000100; // Enable Pulse Steering on P1C (RC3)
for(;;) {
CCPR1L=50;
}
}