STC8H8K64U P2.0 P2.2两路PWM信号测试通过
本文介绍了基于STC8H单片机的高级PWM定时器测试记录。程序配置PWM1P(P2.0)和PWM2P(P2.2)输出2.2kHz方波,使用12MHz时钟。通过设置PWMA_CCR1/CCR2为2000和ARR为5000来调节占空比和周期,并启用预装载和输出使能功能。初始化包括IO口配置为推挽输出,以及PWM模式1设置。主程序先进行端口测试后进入PWM输出模式,通过控制相关寄存器实现稳定波形输出。


边沿对齐 PWM输出频率=12/(PWMx_PSCR+1)X(PWMx_ARR+1)
中间对齐 PWM输出频率=12/(PWMx_PSCR+1)XPWMx_ARRX2
测试记录
12MHZ
P2.0 2.4KHZ
P2.2 2.4KHZ
PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=5000; //设置周期时间
占空比PWMA_CCR1/PWMA_ARR=2000/5000=0.4

#include "STC8H.h" //
#include "intrins.h" //
#define uchar unsigned char //
#define uint unsigned int //
#define ENO1P 0x01
#define ENO2P 0x04
#define PWM1_2 0x01 //P:P2.0 N:P2.1
#define PWM2_2 0x04 //P:P2.2 N:P2.3
sbit OutPut0=P2^0; //
sbit OutPut1=P2^2;
uchar SS;
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/*************关所有输出*******************************/
void Init_io()
{
P1M0=0X00; //
P1M1=0X00; //
P2M0=0x05;
P2M1=0x00;
P3M0=0X00; //
P3M1=0X00; //
P5M0=0X00; //
P5M1=0X00; //
}
/******************** 主函数 **************************/
void main(void)
{
P_SW2|=0X80;
EA=1;
Init_io();
for(SS=0;SS<5;SS++)
{
OutPut0=0;
OutPut1=0;
Delay100ms(10);
OutPut0=1;
OutPut1=1;
Delay100ms(10);
}
//
PWMA_PS=0x00;
PWMA_PS|=PWM1_2; //选择 PWM1_2 通道
PWMA_PS|=PWM2_2; //选择 PWM2_2 通道
PWMA_CCER1=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCER2=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1=0x60; //设置 PWM1 模式1 输出
PWMA_CCMR2=0x60; //设置 PWM1 模式1 输出
PWMA_CCER1=0x11; //使能 CC1E 通道, 高电平有效
PWMA_CCER2=0x01; //
PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=5000; //设置周期时间
PWMA_ENO = 0x00;
PWMA_ENO |= ENO1P; //使能输出
PWMA_ENO |= ENO2P; //使能输出
PWMA_BKR = 0x80; //刹车寄存器 主输出使能
PWMA_CR1 |= 0x81; //BIT7 ARPEA=1 预装载 BIT0 CENA=1 开始计时
while(1)
{
} //
} //
////////////////////////////////////////////

12MHZ
P2.0 4KHZ
P2.2 4KHZ
PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=3000; //设置周期时间
占空比PWMA_CCR1/PWMA_ARR=0.666
#include "STC8H.h" //
#include "intrins.h" //
#define uchar unsigned char //
#define uint unsigned int //
#define ENO1P 0x01
#define ENO2P 0x04
#define PWM1_2 0x01 //P:P2.0 N:P2.1
#define PWM2_2 0x04 //P:P2.2 N:P2.3
sbit OutPut0=P2^0; //
sbit OutPut1=P2^2;
uchar SS;
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/*************关所有输出*******************************/
void Init_io()
{
P1M0=0X00; //
P1M1=0X00; //
P2M0=0x05;
P2M1=0x00;
P3M0=0X00; //
P3M1=0X00; //
P5M0=0X00; //
P5M1=0X00; //
}
/******************** 主函数 **************************/
void main(void)
{
P_SW2|=0X80;
EA=1;
Init_io();
for(SS=0;SS<5;SS++)
{
OutPut0=0;
OutPut1=0;
Delay100ms(10);
OutPut0=1;
OutPut1=1;
Delay100ms(10);
}
//
PWMA_PS=0x00;
PWMA_PS|=PWM1_2; //选择 PWM1_2 通道
PWMA_PS|=PWM2_2; //选择 PWM2_2 通道
PWMA_CCER1=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCER2=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1=0x60; //设置 PWM1 模式1 输出
PWMA_CCMR2=0x60; //设置 PWM1 模式1 输出
PWMA_CCER1=0x11; //使能 CC1E 通道, 高电平有效
PWMA_CCER2=0x01; //
PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=3000; //设置周期时间
PWMA_ENO = 0x00;
PWMA_ENO |= ENO1P; //使能输出
PWMA_ENO |= ENO2P; //使能输出
PWMA_BKR = 0x80; //刹车寄存器 主输出使能
PWMA_CR1 |= 0x81; //BIT7 ARPEA=1 预装载 BIT0 CENA=1 开始计时
while(1)
{
} //
} //
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=2200; //设置周期时间
占空比PWMA_CCR1/PWMA_ARR=
2000/2200=0.9
12MHZ
P2.0 5.46KHZ
P2.2 5.46KHZ
#include "STC8H.h" //
#include "intrins.h" //
#define uchar unsigned char //
#define uint unsigned int //
#define ENO1P 0x01
#define ENO2P 0x04
#define PWM1_2 0x01 //P:P2.0 N:P2.1
#define PWM2_2 0x04 //P:P2.2 N:P2.3
sbit OutPut0=P2^0; //
sbit OutPut1=P2^2;
uchar SS;
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/*************关所有输出*******************************/
void Init_io()
{
P1M0=0X00; //
P1M1=0X00; //
P2M0=0x05;
P2M1=0x00;
P3M0=0X00; //
P3M1=0X00; //
P5M0=0X00; //
P5M1=0X00; //
}
/******************** 主函数 **************************/
void main(void)
{
P_SW2|=0X80;
EA=1;
Init_io();
for(SS=0;SS<5;SS++)
{
OutPut0=0;
OutPut1=0;
Delay100ms(10);
OutPut0=1;
OutPut1=1;
Delay100ms(10);
}
//
PWMA_PS=0x00;
PWMA_PS|=PWM1_2; //选择 PWM1_2 通道
PWMA_PS|=PWM2_2; //选择 PWM2_2 通道
PWMA_CCER1=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCER2=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1=0x60; //设置 PWM1 模式1 输出
PWMA_CCMR2=0x60; //设置 PWM1 模式1 输出
PWMA_CCER1=0x11; //使能 CC1E 通道, 高电平有效
PWMA_CCER2=0x01; //
PWMA_CCR1=2000; //设置占空比时间
PWMA_CCR2=2000; //设置占空比时间
PWMA_ARR=2200; //设置周期时间
PWMA_ENO = 0x00;
PWMA_ENO |= ENO1P; //使能输出
PWMA_ENO |= ENO2P; //使能输出
PWMA_BKR = 0x80; //刹车寄存器 主输出使能
PWMA_CR1 |= 0x81; //BIT7 ARPEA=1 预装载 BIT0 CENA=1 开始计时
while(1)
{
} //
} //
更多推荐



所有评论(0)