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:关闭输入捕获/比较输出 ||||||||
| CC1P | 1:开启输入捕获/比较输出 ||||||||
| CC1E | 0:高电平有效 ||||||||
| CC1E | 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;
    }
}