Sida 1 av 1

fråga om PWM + 16f690

Postat: 12 februari 2011, 16:53:45
av Christian
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

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;
  }
 }

Re: fråga om PWM + 16f690

Postat: 12 februari 2011, 17:39:05
av sodjan
Det är ju så lite kod så gör samma sak i assembler så att du är
helt säker på vad koden gör. Generellt kan det vara bra att göra
små test-case i assembler när något uppför sig underligt, det
blir lite lättare att felsöka. Sedan, när man är helt säker på hur
det ska vara, kan man överföra det till valfritt annat språk.

Men för att svara på din fråga så, nej, man ska naturligstvis
inte behöva uppdattera PWM modulen hela tiden, den är
"set-n-forget". Du gör något fel, helt enkelt.

Re: fråga om PWM + 16f690

Postat: 12 februari 2011, 18:24:11
av Pajn
Koden får inte ta slut, vilket betyder att du måste ha en loop.
Däremot kan du lägga dutyn före loopen om du bara vill sätta den en gång.

Kod: Markera allt

#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)
 
  CCPR1L=50;
  for(;;) {
  }
}

Re: fråga om PWM + 16f690

Postat: 12 februari 2011, 21:24:35
av Fransson
:humm: Hmm...

Ren spekulation bara...

Skulle det kunna ha något med /* Init PWM for Single Output */ och // Single PWM mode; att göra??? Det låter som att den bara ska göra en puls och sedan stanna.
(Alltså koden som står där, inte kommentarena i sig.)

Re: fråga om PWM + 16f690

Postat: 13 februari 2011, 02:08:21
av sodjan
Nja, "Init PWM for Single Output" har väl med att göra hur många
utgångar man ska hah från PWM modulen.

Det där om att "koden inte får ta slut" är intressantare.