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