我要做一个pwm发生器,周期20ms,占空比在5%~10%之间变化
发布网友
发布时间:2022-04-25 02:27
我来回答
共1个回答
热心网友
时间:2023-11-07 11:39
50HZ要求不高,下面这个给你参考,建议你的晶振要么32.768M的,要么16.384M比较准容易实现
这个程序的pca当定时器用了,没有用它的pwm功能,因为它的pwm只有8位(16位不是不行有点麻烦)
#include "51.h"
#include "stc12c5a_pca.h"
sfr AUXR = 0x8E;
#define PCA_SPEED 0x80 //pca备频设置
#define PCA_OUTPUT_POLARITY 1 //输出极性 0:低电平开启 1:高电平开启
#define PWM_OUTPUT_PORT P2
uint16 PWM_CH0_Value=10000,PWM_CH1_Value=0x7fff;
uint8 PWM_OpenBit=0x0f; //低四位由ch0输出,高四位由ch1输出
extern bit SF_TASKRUN_FLAG;
void PCA_ISR(void) interrupt 7
{
if (CCF0) {
CCF0=0;
#if PCA_OUTPUT_POLARITY
PWM_OUTPUT_PORT&=~(PWM_OpenBit&0x0f);
#else
PWM_OUTPUT_PORT|=(PWM_OpenBit&0x0f);
#endif
}
if (CCF1) {
CCF1=0;
#if PCA_OUTPUT_POLARITY
PWM_OUTPUT_PORT&=~(PWM_OpenBit&0xf0);
#else
PWM_OUTPUT_PORT|=(PWM_OpenBit&0xf0);
#endif
}
/**/if (CF) {
CF=0;
CCAP0L=(uint8)PWM_CH0_Value;
CCAP1L=(uint8)PWM_CH1_Value;
#ifdef PCA_SPEED
CH=PCA_SPEED;
CCAP0H=(uint8)(~PWM_CH0_Value>>8)|PCA_SPEED;
CCAP1H=(uint8)(~PWM_CH1_Value>>8)|PCA_SPEED;
#else
CCAP0H=(uint8)(~PWM_CH0_Value>>8);
CCAP1H=(uint8)(~PWM_CH1_Value>>8);
SF_TASKRUN_FLAG=1;
#endif
#if PCA_OUTPUT_POLARITY
PWM_OUTPUT_PORT=0xff;
#else
PWM_OUTPUT_PORT=0x0;
#endif
}
}
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
void PCA_Init(void)
{
P2M1=0x00;
P2M0=0xff;
//stc 1t pca
CMOD = (0x04<<1)|1;//pca1T
#ifdef PCA_SPEED
CH=PCA_SPEED;
#endif
CCAPM0=0x49;
CCAPM1=0x49;
CCF0=0;
CCF1=0;
CF=0; //清pca中断
PPCA=1; //12c5a pca高优先级
CR=1; //启动pca输出
}