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; //使能XFRPWMA_PS = 0x0A; //PWM-1设置为 P6.0;PWM-2设置为P6.2PWMB_PS = 0xF0; //PWM-7设置为P7.6;PWM-8设置为P7.7PWMA_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模式1PWMA_CCMR2 = 0x68; //设置CC2为PWMA输出模式 PWM模式1PWMB_CCMR3 = 0x68; //设置CC7为PWMA输出模式 PWM模式1PWMB_CCMR4 = 0x68; //设置CC8为PWMA输出模式 PWM模式1PWMA_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;}
}