16 비트의 PWM

C

chamarnadh

Guest
안녕 친구

스피 어 16 비트 PWM 등이 함께 Silabs C8051F005.with이의 PWM 주파수를 사용하여 250 개 이상의 Hz에서 고군분투 스피 어 안한다.내가 1KHz 이상의 PWM 등이 함께 싶어요.
난 시간은 PWM 및 Timer0 대한 PCA PCA 기지에 사용합니다.

이것은 내
C 코드입니다.아무도 이것에 대한 제안 수있습니다.

사전에 감사합니다
Amarnadh# 포함 <c8051f000.h>
# 포함 <stdio.h>
# 포함 <string.h>
/ / # 포함 <math.h>= P0 PWM_OUT sbit ^ 0;
sbit 테스트 = P0 ^ 1;
/ / sbit T2는 = P0 ^ 5; / / 카운터 inputT2
/ / sbit PWM_CCW = P0 ^ 5;
sbit PWM_CCW = P0 ^ 6;
sbit PWM_CW = P0 ^ 7;PWM_START 0x8000 정의 #

서명은 PWM = PWM_START;
DIR은 서명 int;무효 SYSCLK_Init (무효)
(
int n;
OSCXCN = 0x67; / / 외부 발진기 컨트롤 등록
회 (N = 1; n <255; n ); / / 대한 비우기 간격 (> 1ms)
XTLVLD동안 ((OSCXCN &은 0x80) == 0); / / xtal OSC 기다리는 시작

OSCICN = 0x88; / / 내부 오실레이터를 제어 등록
/ / SYSCLK 소스 및 외부 오실레이터로 선택
/ / 실종 시계 감지기 활성화
)

무효 Rx_byte ()
(
동안 (! RI의); / / RI의 플래그를 설정 때까지 기다려
RI의 = 0; / / 분명 RI의 깃발
)무효 Tx_byte (서명 숯불 C)
(
SBUF = C;
동안 (! TI는); / / 때까지 기다릴 TI의 플래그를 설정
TI는 = 0; / / 분명 TI의 깃발
)무효 delay_ms (서명 int)
(
int j를;

(일본 = 0;
대한 j를 <내가; j를 )
(
TMR3CN = 0x04;
/ / 1ms에 대한 timer3 장전 가치 = 64614.

TMR3RLH = 0xFC; / / 타이머 3 장전 등록 상위 바이트
TMR3RLL = 0x66; / / 타이머 3 장전 등록 저가 바이트

(TMR3CN == 0x04);

TMR3CN = 0x00;
)
)

무효 Tx_string (서명 숯불 [])
(
서명되지 않은 숯불 난;
delay_ms (100); / / 지연 필수
위한은 (i = 0; [나]! = '\ 0'; 난 )
Tx_byte ([내가]);
)
무효 PORT_Init (무효)
(
XBR0 = 0x08; / / XBAR0 : 초기 리셋 값
XBR1 = 0x00; / / XBAR1 : 초기 재설정 값, Timer2 외부 I / P를 활성화
XBR2 = 0x40; / / XBAR2 : 초기 리셋 값

/ / 포트 구성 (= 출력 당겨) 1 푸시
PRT0CF = 0x01; P0 / / 출력 구성
PRT1CF = 0x00; / /
PRT2CF = 0x00; P2 / / 출력 구성
PRT3CF = 0x00; P3 / / 출력 구성
)

무효 UART0_Init (무효)
(
SCON = 0x50; / / 시리얼 포트 컨트롤 등록; mode1, 8bit의 UART, rcvr 활성화
SCON & = 0xFC; / / 취소 보류
깃발을 방해
PCON = 0x80으로; / / 전원 제어 등록 SMOD = 1,의 UART에 시계를 두 배로
)

무효 타이머 (무효)
(
//------------------------------------------------ ----------------
/ / 타이머 구성
//------------------------------------------------ ----------------

CKCON = 0x08; / / 클럭 제어 등록 타이머 0을 사용하는 시스템 CLK
TH0 = 0x00; / / 타이머 0 상위 바이트
TL0 =를 0xFF; / / 타이머 0 하위 바이트
TH1 = 0xB8; / / 타이머 1 상위 바이트, 9600에 대한 baudrate 가치
TL1 = 0x00; / / 타이머 1 하위 바이트
TMOD = 0x02; / / Timer0 모드에서 16 비트 카운터이다, Timer1 모드 8bit 카운터 / timerwith autoreload입니다
TCON = 0x30; / / 타이머 제어 등록 타이머 1, timer0 오버플로 플래그를 설정
활성화
)무효 PCA_Init (무효)
(
//------------------------------------------------ ----------------
/ / PCA 구성
//------------------------------------------------ ----------------

PCA0MD = 0x05; / / PCA 시간 오버플로 PCA 기지 = Timer0 인터럽트 모드 등록 및 비활성화 CF
= 0x40 /
/ PCA0CN; / / PCA 카운터를
활성화
PCA0H = 0x00; / / PCA 카운터 / 타이머 상위 바이트
PCA0L = 0x00; / / PCA 카운터 / 타이머 저가 바이트

/ / 모듈 0
PCA0CPL0 = (를 0xFF &의 PWM);
PCA0CPH0 = (를 0xFF & (PWM 등이>>

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

); / / 오른쪽
8 교대

PCA0CPM0 = 0x4D; / / 0x49; / / PCA 캡처 / 등록 0 활성화 비교 기능
비교/ / 하이 스피드 보시려면 / p 하이라이트 모드
)무효 timer0_ISR (무효)
1 인터럽트
(/ / 테스트 = ~ 테스트;
TR0 = 0; / / Timer0 해제TH0 =를 0xFF; / / 타이머 0 상위 바이트의 PWM 주파수가이 값을 200hz입니다

TL0 =를 0xFF; / / 타이머 0 하위 바이트의 PWM 주파수

TR0 = 1; / / Timer0 활성화)

무효 PCA_ISR (무효)
9 방해

(
/ / / 테스트 = ~ 테스트;
(CCF0)

(
CCF0 = 0;
(PWM_OUT)
(
PCA0CPL0 = (를 0xFF &의 PWM);
PCA0CPH0 = (를 0xFF & (PWM 등이>>

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

); / / 오른쪽
8 교대
)
그 밖의
(
PCA0CPL0 = 0;
PCA0CPH0 = 0;
)
) 다른 경우 (CCF1)

(
CCF1 = 0;
) 다른 경우 (CCF2)
(
CCF2 = 0;
) 다른 경우 (CCF3)
(
CCF3 = 0;
) 다른 경우 (CCF4)
(
CCF4 = 0;
) 다른 경우 (CF)
(
CF = 0;
)

)무효 메인 (무효)

(

WDTCN = 0xDE; / / 비활성화 WDT
WDTCN = 0xAD; / / 비활성화 WDT

PORT_Init ();
SYSCLK_Init ();
타이머 ();
PCA_Init ();
UART0_Init ();
는 IE = 0x82; / / 인터럽트 t0와 글로벌 활성화
/ / IP를 = 0x02; / / Timer0 인터럽트 높은 우선순위 설정
/ / 개 = 1;
EIE1 | = 0x08; / / PCA 인터럽트
활성화EIP1 | = 0x08;

PCA0CN = 0x40;

(1) 동안
(

PCON | = 0x01;

))

 
귀하의 문제는 사실은,
네 자신을 위해 (?) 코멘트에 따라 200Hz을해야 오버플 ISR, (목 =를 0xFF, ATL 촌놈 =를 0xFF) 0xFFFF로드 Timer0와 관련이있을 수 있을까요?

난 리기 매크로를 만드는 게 좋을 것 / 원하는 주파수와로드 레지스트리에서 적절한 값을 걸립 기능, 따라서 코드의 두 개의 서로 다른 조각 같은 일을하고있는 서면을 피하고 (다시, 타이머의 초기화 부분에 로딩 ISR).

난이 도움이되기를 바랍니다.

 
당신이
감사 mr.Arthur

내가 확인합니다Rgds
Amarnadh

 

Welcome to EDABoard.com

Sponsor

Back
Top