STC8H8K64U单片机PWM配置

STC8H8K64U单片机配置PWM的通道1、通道2、通道7、通道8。STC8可以分为两组PWM,PWMA和PWMB,在使用时,如果同时使用了两组,那么两组的寄存器需要同时配置。

一、PWM输出频率计算公式

边沿对齐

PWM输出频率 = 系统工作频率 / (PWMx_PSCR + 1) * (PWMx_ARR + 1);

中间对齐

PWM输出频率 = 系统工作频率 / (PWMx_PSCR + 1) * PWMx_ARR * 2;

二、引脚重定义

STC8H8K64U单片机PWM引脚重定义对照表
符号B7B6B5B4B3B2B1B0
PWMA_PSC4PS[1:0]C3PS[1:0]C2PS[1:0]C1PS[1:0]
PWMB_PSC8PS[1:0]C7PS[1:0]C6PS[1:0]C5PS[1:0]

PWM通道 1 引脚选择
C1PS[1:0]PWM1PPWM1N
00P1.0P1.1
01P2.0P2.1
10P6.0P6.1
11
PWM通道 2 引脚选择
C2PS[1:0]PWM2PPWM2N
00P1.2P1.3
01P2.2P2.3
10P6.2P6.3
11
没有P1.2口的切换到P5.4口上
PWM通道 3 引脚选择
C3PS[1:0]PWM3PPWM3N
00P1.4P1.5
01P2.4P2.5
10P6.4P6.5
11
PWM通道 4 引脚选择
C4PS[1:0]PWM4PPWM4N
00P1.6P1.7
01P2.6P2.7
10P6.6P6.7
11P3.4P3.3
PWM通道 5 引脚选择
C5PS[1:0]PWM5
00P2.0
01P1.7
10P0.0
11P7.4
PWM通道 6 引脚选择
C6PS[1:0]PWM6
00P2.1
01P5.4
10P0.1
11P7.5
PWM通道 7 引脚选择
C7PS[1:0]PWM7
00P2.2
01P3.3
10P0.2
11P7.6
PWM通道 8 引脚选择
C8PS[1:0]PWM8
00P2.3
01P3.4
10P0.3
11P7.7

三、设置PWM输出开关和有效电平

STC8H8K64U单片机PWM捕获/比较使能寄存器
符号B7B6B5B4B3B2B1B0
PWMA_CCER1CC2NPCC2NECC2PCC2ECC1NPCC1NECC1PCC1E
PWMB_CCER1CC6PCC6ECC5PCC5E
PWMA_CCER2CC4NPCC4NECC4PCC4ECC3NPCC3NECC3PCC3E
PWMB_CCER2CC8PCC8ECC7PCC7E
CC1P0:关闭输入捕获/比较输出
1:开启输入捕获/比较输出
CC1E0:高电平有效
1:低电平有效

四、输出使能寄存器

STC8H8K64U单片机PWM输出使能寄存器
符号B7B6B5B4B3B2B1B0
PWMA_ENOENO4NENO4PENO3NENO3PENO2NENO2PENO1NENO1P
PWMB_ENOENO8PENO7PENO6PENO5P

五、程序源码

#define PWM_PSC      11     //设置预分频值
#define PWM_PERIOD   124    //设置周期值



void PWM_Init(void)
{	
	P_SW2 |= 0x80;			 //使能XFR
	
	PWMA_PS = 0x0A; 		//PWM-1设置为 P6.0;PWM-2设置为P6.2
	PWMB_PS = 0xF0;			//PWM-7设置为P7.6;PWM-8设置为P7.7
	
	PWMA_CCER1 = 0x00;      //写CCMRx前必须先清零CCERx关闭通道
	PWMB_CCER1 = 0x00;      //写CCMRx前必须先清零CCERx关闭通道
	PWMA_CCER2 = 0x00;      //写CCMRx前必须先清零CCERx关闭通道
	PWMB_CCER2 = 0x00;      //写CCMRx前必须先清零CCERx关闭通道
			
	PWMA_CCMR1 = 0x68;      //设置CC1为PWMA输出模式 PWM模式1
	PWMA_CCMR2 = 0x68;      //设置CC2为PWMA输出模式 PWM模式1
	PWMB_CCMR3 = 0x68;      //设置CC7为PWMA输出模式 PWM模式1
	PWMB_CCMR4 = 0x68;      //设置CC8为PWMA输出模式 PWM模式1
		
	PWMA_CCER1 = 0x11;      //使能CC1、CC2通道
	PWMB_CCER2 = 0x11;      //使能CC7、CC8通道
	
	PWMA_PSCRH = (u8)(PWM_PSC >> 8); //设置分频系数
	PWMA_PSCRL = (u8)PWM_PSC;
	PWMB_PSCRH = (u8)(PWM_PSC >> 8); //设置分频系数
	PWMB_PSCRL = (u8)PWM_PSC;
		
	PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
	PWMA_ARRL = (u8)PWM_PERIOD;
	PWMB_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
	PWMB_ARRL = (u8)PWM_PERIOD;
		
	PWMA_ENO |= 0x05;       //使能PWM1P和PWM2P端口输出 
	PWMB_ENO |= 0x50;       //使能PWM8P和PWM7P端口输出 
		
	PWMA_BKR = 0x80;        //使能主输出
	PWMB_BKR = 0x80;        //使能主输出
	
	PWMA_CR1 = 0x01;        //开始计时   向上计数
	PWMB_CR1 = 0x01;        //开始计时   向上计数
}


void Set_CHx_Speed(u8 ch,u16 Compare1)
{
    switch(ch)
    {
        case 1:
        {
	        PWMA_CCR1H = (u8)(Compare1 >> 8); //设置占空比时间
	        PWMA_CCR1L = (u8)(Compare1);
        }break;
        case 2:
        {
	        PWMA_CCR2H = (u8)(Compare1 >> 8); //设置占空比时间
	        PWMA_CCR2L = (u8)(Compare1);
        }break;
        case 7:
        {
	        PWMB_CCR7H = (u8)(Compare1 >> 8); //设置占空比时间
	        PWMB_CCR7L = (u8)(Compare1);
        }break;
        case 8:
        {
	        PWMB_CCR8H = (u8)(Compare1 >> 8); //设置占空比时间
	        PWMB_CCR8L = (u8)(Compare1);
        }break;
    }
}




  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值