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;
}
}
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/4a23014ea3.html