PWMA 波形
大家好,请帮忙看看我的示波器波形,为啥是断续的小脉冲。输出频率应该是1KHZ互补波形。
#include "reg51.h"
#include "intrins.h"
typedef struct TIM1_struct
{
volatile unsigned char CR1; /*!< control register 1 */
volatile unsigned char CR2; /*!< control register 2 */
volatile unsigned char SMCR; /*!< Synchro mode control register */
volatile unsigned char ETR; /*!< external trigger register */
volatile unsigned char IER; /*!< interrupt enable register*/
volatile unsigned char SR1; /*!< status register 1 */
volatile unsigned char SR2; /*!< status register 2 */
volatile unsigned char EGR; /*!< event generation register */
volatile unsigned char CCMR1; /*!< CC mode register 1 */
volatile unsigned char CCMR2; /*!< CC mode register 2 */
volatile unsigned char CCMR3; /*!< CC mode register 3 */
volatile unsigned char CCMR4; /*!< CC mode register 4 */
volatile unsigned char CCER1; /*!< CC enable register 1 */
volatile unsigned char CCER2; /*!< CC enable register 2 */
volatile unsigned char CNTRH; /*!< counter high */
volatile unsigned char CNTRL; /*!< counter low */
volatile unsigned char PSCRH; /*!< prescaler high */
volatile unsigned char PSCRL; /*!< prescaler low */
volatile unsigned char ARRH; /*!< auto-reload register high */
volatile unsigned char ARRL; /*!< auto-reload register low */
volatile unsigned char RCR; /*!< Repetition Counter register */
volatile unsigned char CCR1H; /*!< capture/compare register 1 high */
volatile unsigned char CCR1L; /*!< capture/compare register 1 low */
volatile unsigned char CCR2H; /*!< capture/compare register 2 high */
volatile unsigned char CCR2L; /*!< capture/compare register 2 low */
volatile unsigned char CCR3H; /*!< capture/compare register 3 high */
volatile unsigned char CCR3L; /*!< capture/compare register 3 low */
volatile unsigned char CCR4H; /*!< capture/compare register 3 high */
volatile unsigned char CCR4L; /*!< capture/compare register 3 low */
volatile unsigned char BKR; /*!< Break Register */
volatile unsigned char DTR; /*!< dead-time register */
volatile unsigned char OISR; /*!< Output idle register */
}TIM1_TypeDef;
#define TIM1_BaseAddress 0xFEC0
#define TIM1 ((TIM1_TypeDef xdata*)TIM1_BaseAddress)
#define PWMA_ENO (*(unsigned char volatile xdata *)0xFEB1)
#define PWMA_PS (*(unsigned char volatile xdata *)0xFEB2)
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P_SW2 = 0xba;
sbit P03 = P0^3;
void main(void)
{
P_SW2 = 0x80;
P0M1 = 0x00;
P0M0 = 0xFF;
P1M1 = 0x00;
P1M0 = 0xFF;
PWMA_ENO = 0xFF; //IO输出PWM
PWMA_PS = 0x00; //00:PWM at P1
/**********************************************************
PWMx_duty = *100
***********************************************************/
TIM1-> PSCRH = 0x00; //预分频寄存器
TIM1-> PSCRL = 0x00;
TIM1-> DTR = 0x00; //死区时间配置
TIM1-> CCMR1 = 0x68; //通道模式配置
TIM1-> CCMR2 = 0x68;
TIM1-> CCMR3 = 0x68;
TIM1-> CCMR4 = 0x68;
TIM1-> ARRH = 0x08; //自动重装载寄存器,计数器overflow点
TIM1-> ARRL = 0x00;
TIM1-> CCR1H = 0x04; //计数器比较值
TIM1-> CCR1L = 0x00;
TIM1-> CCR2H = 0x02;
TIM1-> CCR2L = 0x00;
TIM1-> CCR3H = 0x01;
TIM1-> CCR3L = 0x00;
TIM1-> CCR4H = 0x01;
TIM1-> CCR4L = 0x00;
TIM1-> CCER1 = 0x55; //配置通道输出使能和极性
TIM1-> CCER2 = 0x55; //配置通道输出使能和极性
TIM1-> BKR = 0x80; //主输出使能 相当于总开关
TIM1-> IER = 0x02; //使能中断
TIM1-> CR1 = 0x01; //使能计数器
EA = 1;
while (1);
}
void PWMA_ISR() interrupt 26
{
if(TIM1->SR1 & 0X02)
{
P03 = ~P03;
TIM1->SR1 &=~0X02;
}
}
原因找到了,不能放WHILE循环里面
页:
[1]