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引脚重定义对照表
符号 B7 B6 B5 B4 B3 B2 B1 B0
PWMA_PS C4PS[1:0] C3PS[1:0] C2PS[1:0] C1PS[1:0]
PWMB_PS C8PS[1:0] C7PS[1:0] C6PS[1:0] C5PS[1:0]

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

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

STC8H8K64U单片机PWM捕获/比较使能寄存器
符号 B7 B6 B5 B4 B3 B2 B1 B0
PWMA_CCER1 CC2NP CC2NE CC2P CC2E CC1NP CC1NE CC1P CC1E
PWMB_CCER1 CC6P CC6E CC5P CC5E
PWMA_CCER2 CC4NP CC4NE CC4P CC4E CC3NP CC3NE CC3P CC3E
PWMB_CCER2 CC8P CC8E CC7P CC7E
CC1P 0:关闭输入捕获/比较输出
1:开启输入捕获/比较输出
CC1E 0:高电平有效
1:低电平有效

四、输出使能寄存器

STC8H8K64U单片机PWM输出使能寄存器
符号 B7 B6 B5 B4 B3 B2 B1 B0
PWMA_ENO ENO4N ENO4P ENO3N ENO3P ENO2N ENO2P ENO1N ENO1P
PWMB_ENO ENO8P ENO7P ENO6P ENO5P

五、程序源码

#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;
    }
}




你可能感兴趣的:(STC8)