STC8H1K28,PWM8_3怎么配置?
void PWM_Init(void)
{
// 扩展寄存器
P_SW2 |= 0x80;
P0M0 |= 0x08;// P0.3 设为推挽
P0M1 &= ~0x08;
P1M0 |= 0x40;// P1.6 设为推挽
P1M1 &= ~0x40;
// ========== PWMA配置 (P1.6, 通道4P) ==========
PWMA_CCMR2 = 0x68; // PWM模式1
PWMA_PSCRH = 0x00;
PWMA_PSCRL = 23; // 24MHz / (23+1) = 1MHz (1us每计数)
PWMA_ARRH = 0x4E;
PWMA_ARRL = 0x20; // 设为20000,精准对应20ms周期
PWMA_CCR4H = 0x05; // 1.5ms (1500us) 中位
PWMA_CCR4L = 0xDC;
PWMA_CCER2 = 0x01; // CC4E=1, 使能通道4输出
PWMA_ENO = 0x40; // ENO4P=1, 使能P1.6物理引脚输出
PWMA_BKR = 0x80; // MOE=1, 主输出使能
PWMA_CR1 = 0x81; // 启动计数器
// ========== PWMB配置 (P0.3, 通道8_3) ==========
// 选择PWM8的第3组映射(PWM8_3)输出到P0.3
PWMB_PS &= ~0xC0; // 清除bit7-6
PWMB_PS |= 0x80; // 设置C8PS=10 (对应第3组映射)
PWMB_CCMR4 = 0x68; // 通道8配置为PWM模式1
PWMB_PSCRH = 0x00;
PWMB_PSCRL = 23; // 1MHz 计数频率
PWMB_ARRH = 0x4E;
PWMB_ARRL = 0x20; // 20ms 周期
PWMB_CCR8H = 0x05; // 1.5ms 中位
PWMB_CCR8L = 0xDC;
PWMB_CCER2 = 0x01; // CC8E=1, 使能通道8输出
PWMB_ENO = 0x80; // ENO8P=1, 使能P0.3物理引脚输出
PWMB_BKR = 0x80; // MOE=1
PWMB_CR1 = 0x81; // 启动计数器
}
// ========== 舵机控制函数 ==========
void Servo1_SetAngle(unsigned char angle)// 舵机1: P0.3 (PWMB通道8)
{
unsigned int pulse;
if (angle > 180) angle = 180;
// 脉宽: 500us ~ 2500us, 步长 = (2500-500)/180 ≈ 11.11
pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
PWMB_CCR8H = (unsigned char)(pulse >> 8);
PWMB_CCR8L = (unsigned char)(pulse & 0xFF);
}
void Servo2_SetAngle(unsigned char angle)// 舵机2: P1.6 (PWMA通道4)
{
unsigned int pulse;
if (angle > 180) angle = 180;
pulse = 500 + (unsigned int)((unsigned long)angle * 2000 / 180);
PWMA_CCR4H = (unsigned char)(pulse >> 8);
PWMA_CCR4L = (unsigned char)(pulse & 0xFF);
}
舵机2,P1.6 (PWMA通道4) OK
舵机1,P0.3 (PWMB通道8) 舵机没反应
STC8H1K28,PWM8_3怎么配置
尝试了其他通道,PWMA全部都能工作,PWMB全部都不能工作,应该是PWMB操作不对,请老师指点一下{:4_197:}
尝试用 AiCube 来图形化配置,选择 STC8H8K64U-LQFP64
https://www.stcaimcu.com/thread-19632-1-1.html
没搞定,寄存器配置看起来都是对的,
放弃pwmb,已经全部使用PWMA了{:4_187:} 我也遇到了一样的问题,P0.3口PWMB的8通道无输出 #include <stc8h.h>
// 定义快捷类型
typedef unsigned int uint;
typedef unsigned char uchar;
void PWM_Init(void)
{
// ==========================================
// 0. 开启 XSFR 寄存器访问权限 (必须)
// ==========================================
P_SW2 |= 0x80;
// ==========================================
// 1. 配置 I/O 口模式(STC8H 高阻输入需配置为推挽或准双向)
// ==========================================
// P0.3 配置为推挽输出
P0M1 &= ~0x08; P0M0 |= 0x08;
// P1.6 配置为推挽输出
P1M1 &= ~0x40; P1M0 |= 0x40;
// ==========================================
// 2. 引脚切换映射 (Pin Switch)
// ==========================================
// PWMA_PS 为 C4PS,设置为 00 映射到 P1.6(PWM4P)/P1.7(PWM4N)
PWMA_PS &= ~0xC0;
// PWMB_PS 为 C8PS,设置为 10 映射到 P0.3(PWM8)
PWMB_PS &= ~0xC0;
PWMB_PS |= 0x80;
// ==========================================
// 3. 配置 PWMA 通道 4 (控制 P1.6)
// ==========================================
PWMA_PSCRH = 0; // 时钟不分频 (1T)
PWMA_PSCRL = 0;
PWMA_ARRH = (uchar)(2211 >> 8); // 设置周期 (5kHz)
PWMA_ARRL = (uchar)(2211);
PWMA_CCR4H = (uchar)(1106 >> 8); // 设置占空比 (50%)
PWMA_CCR4L = (uchar)(1106);
PWMA_CCMR4 = 0x60; // 配置通道 4 为 PWM 模式 1
PWMA_CCER2 = 0x10; // 开启通道 4 正向输出 (CC4E = 1)
PWMA_ENO |= 0x40; // 使能 PWM4P 端口输出
PWMA_BKR = 0x80; // 主输出使能 (MOE = 1)
PWMA_CR1 = 0x01; // 启动 PWMA 计数器
// ==========================================
// 4. 配置 PWMB 通道 8 (控制 P0.3)
// ==========================================
PWMB_PSCRH = 0; // 时钟不分频 (1T)
PWMB_PSCRL = 0;
PWMB_ARRH = (uchar)(2211 >> 8); // 设置周期 (5kHz)
PWMB_ARRL = (uchar)(2211);
PWMB_CCR8H = (uchar)(1106 >> 8); // 设置占空比 (50%)
PWMB_CCR8L = (uchar)(1106);
PWMB_CCMR4 = 0x60; // 配置通道 8 为 PWM 模式 1
PWMB_CCER2 = 0x10; // 开启通道 8 正向输出 (CC8E = 1)
PWMB_ENO |= 0x40; // 使能 PWM8 端口输出
PWMB_BKR = 0x80; // 主输出使能 (MOE = 1)
PWMB_CR1 = 0x01; // 启动 PWMB 计数器
// 关闭 XSFR 访问权限(保持安全习惯)
P_SW2 &= ~0x80;
}
void main(void)
{
PWM_Init(); // 初始化并启动硬件PWM
while (1)
{
// 硬件自动输出,CPU完全释放,可在此处理其他业务
}
} 关键点:CCMR的值应当设置成0x60而不是0x68
PWMA_CCMR4 = 0x60;
PWMB_CCMR4 = 0x60;
这样改就OK了
页:
[1]