16 bittinen PWM

C

chamarnadh

Guest
Hei ystävät

IAM kamppailee 16 bittinen PWM käyttäen Silabs C8051F005.with tämän IAM saa PWM taajuus yli 250 Hz.Haluan PWM kanssa 1kHz tai enemmän.
Käytin PCA varten PWM ja Timer0 varten PCA aika perustaa.

Tämä on minun C-koodia.Voiko joku ehdottaa tätä.

Thanks in Advance
Amarnadh#
include <c8051f000.h>
#
include <stdio.h>
#
include <string.h>
/ / #
include <math.h>sbit PWM_OUT = P0 ^ 0;
sbit testi = P0 ^ 1;
/ / sbit T2 = P0 ^ 5; / / counter inputT2
/ / sbit PWM_CCW = P0 ^ 5;
sbit PWM_CCW = P0 ^ 6;
sbit PWM_CW = P0 ^ 7;#
define PWM_START 0x8000

unsigned PWM = PWM_START;
unsigned int DIR;mitätön SYSCLK_Init (void)
(
int n;
OSCXCN = 0x67; / / ULKOISET Oscillator valvontavaliokunnan Rekisteröidy
for (n = 1, n <255; n ); / / XTLVLD pimennyksen interval (> 1ms)
kun taas ((OSCXCN & 0x80) == 0); / / odota xtal OSC käynnistyvät

OSCICN = 0x88; / / Sisäinen Oscillator valvontavaliokunnan Rekisteröidy
/ / Select ulkoinen oskillaattori kuin SYSCLK lähde-ja
/ /
Enable puuttuu kello detektori
)

mitätön Rx_byte ()
(
while (! RI); / / odota RI lippu asetettu
RI = 0; / /
klart RI lippu
)mitätön Tx_byte (unsigned char c)
(
SBUF = c;
while (! TI); / / odota TI lippu asetettu
TI = 0; / /
klart TI lippu
)mitätön delay_ms (unsigned int i)
(
int j;

for (j = 0, j <i, j )
(
TMR3CN = 0x04;
/ / Timer3 reload arvo = 64614 varten 1ms.

TMR3RLH = 0xFC; / / Timer 3 Reload Rekisteröidy High Byte
TMR3RLL = 0x66; / / Timer 3 Reload Rekisteröidy Low Byte

while (TMR3CN == 0x04);

TMR3CN = 0x00;
)
)

mitätön Tx_string (unsigned char a [])
(
unsigned char i;
delay_ms (100); / / viive tarvitaan
for (i = 0, a ! = '\ 0'; i )
Tx_byte (a );
)
mitätön PORT_Init (void)
(
XBR0 = 0x08; / / XBAR0: Alustava Nollaa arvo
XBR1 = 0x00; / / XBAR1: Alustava Nollaa arvo, Timer2 Ulkoiset I / P Enable
XBR2 = 0x40; / / XBAR2: Alustava Nollaa arvo

/ / Port configuration (1 = Push Pull Output)
PRT0CF = 0x01; / / Output asetuksia P0
PRT1CF = 0x00; / /
PRT2CF = 0x00; / / Output asetuksia P2
PRT3CF = 0x00; / / Output asetuksia P3
)

mitätön UART0_Init (void)
(
SCON = 0x50; / / Serial Port Control rekisteriin; Mode1, 8bit UART, jotta rcvr
SCON & = 0xFC; / /
klart keskeyttää kunnes liput
PCON = 0x80; / / Power Control Register SMOD = 1, doubles kellon UART
)

mitätön ajastin (void)
(
//------------------------------------------------ ----------------
/ / Timer Kokoonpanoasetukset
//------------------------------------------------ ----------------

CKCON = 0x08; / / Kello valvontavaliokunnan Rekisteröidy ajastin 0 käyttää sys CLK
TH0 = 0x00; / / Timer 0 High Byte
TL0 = 0xFF; / / Timer 0 Low Byte
TH1 = 0xB8; / / Ajastin 1 High Byte, Baudrate arvo 9600
TL1 = 0x00; / / Ajastin 1 Low Byte
TMOD = 0x02; / / Timer0 tila on 16bit counter, Timer1 Mode on 8bit counter / timerwith autoreload
TCON = 0x30; / / Timer Control Rekisteröidy Timer 1 käytössä, timer0 overflow lippu asetettu

)mitätön PCA_Init (void)
(
//------------------------------------------------ ----------------
/ / PCA Kokoonpanoasetukset
//------------------------------------------------ ----------------

PCA0MD = 0x05; / / PCA aikaa base = Timer0 overflow PCA Mode ja rekisterihallitus poistaa CF keskeyttää
/ / PCA0CN = 0x40; / / Ota PCA counter

PCA0H = 0x00; / / PCA Counter / Timer High Byte
PCA0L = 0x00; / / PCA Counter / Timer Low Byte

/ / Moduuli 0
PCA0CPL0 = (0xff & PWM);
PCA0CPH0 = (0xff & (PWM>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Viileä" border="0" />

); / / Oikea siirtyminen 8

PCA0CPM0 = 0x4D; / / 0x49; / / PCA Capture / Vertaa Rekisteröidy 0 Ota vertailutehdas toiminto
/ / High speed o / p-tilassa
)mitätön timer0_ISR (void) keskeyttää 1
(/ / testi = ~ testi;
TR0 = 0; / / Timer0 PoistaTH0 = 0xFF; / / Timer 0 High Byte PWM taajuus tämä arvo on 200hz

TL0 = 0xFF; / / Timer 0 Low Byte PWM taajuus

TR0 = 1; / / Timer0 Enable)

mitätön PCA_ISR (void) keskeyttää 9

(
/ / / testi = ~ testi;
if (CCF0)

(
CCF0 = 0;
if (PWM_OUT)
(
PCA0CPL0 = (0xff & PWM);
PCA0CPH0 = (0xff & (PWM>>

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Viileä" border="0" />

); / / Oikea siirtyminen 8
)
muuten
(
PCA0CPL0 = 0;
PCA0CPH0 = 0;
)
)
Else if (CCF1)

(
CCF1 = 0;
)
Else if (CCF2)
(
CCF2 = 0;
)
Else if (CCF3)
(
CCF3 = 0;
)
Else if (CCF4)
(
CCF4 = 0;
)
Else if (CF)
(
CF = 0;
)

)mitätön main (void)

(

WDTCN = 0xDE; / / Poista WDT
WDTCN = 0xAD; / / Poista WDT

PORT_Init ();
SYSCLK_Init ();
ajastin ();
PCA_Init ();
UART0_Init ();
IE = 0x82; / / Ota T0 ja Global katkaisevat
/ / IP = 0x02; / / Aseta Timer0 Interrupt Etusija korkea
/ / EA = 1;
EIE1 | = 0x08; / / Ota PCA Keskeytä
EIP1 | = 0x08;

PCA0CN = 0x40;

kun taas (1)
(

PCON | = 0x01;

))

 
Voisiko teidän ongelma liittyy siihen, että lataat Timer0 kanssa 0xFFFF (TH = 0xFF, TL = 0xFF) in ylivuodon ISR, jonka mukaan oma (?) Kommentti olisi 200Hz?

I'd kannattaa luoda Preprocessor makro-toiminto, joka ottaa haluamasi taajuus ja lataa asianmukainen arvot rekistereihin, jolloin vältetään kirjallisesti kaksi eri kappaletta koodi tekee samoin (lastaus ajastin on käynnistystoimien osa, ja jälleen, että ISR).

Toivon, että tämä auttaa.

 
kiitos mr.Arthur

Aion tarkistaa tämän yhdenRgds
Amarnadh

 

Welcome to EDABoard.com

Sponsor

Back
Top