Yim_Hom
发表于 2025-2-22 00:38:30
没用过你这个芯片,但是专门帮你看了手册,功能是有的:
那使用P5.4口的时候,你得在下载选择里确认 “复位脚用作IO口”
下面的是验证过的:
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_PSCR = 0; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_DTR= 0; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_ARR = 0xffff; // 自动重装载寄存器,控制PWM周期
PWMA_CNTR = 0; //清零编码器计数器值
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_PS = 0;
PWMA_ENO = 0; //IO禁止输出PWM,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
PWMA_CCMR1= 0x01+(10<<4); // 通道1模式配置, 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
PWMA_CCMR2= 0x01+(10<<4); // 通道2模式配置, 配置成输入通道, 0~15对应输入滤波时钟数: 1 2 4 8 12 16 24 32 48 64 80 96 128 160 192 256
PWMA_SMCR = 2; // 编码器模式, 模式1或模式2: 每个脉冲两个边沿加减2. 模式3: 每个脉冲四个边沿加减4.
PWMA_CCER1= 0x55; // 配置通道输入使能和极性, 允许输入, 下降沿
PWMA_PS |= 0; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
PWMA_PS |= (0<<2); // 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,
PWMA_IER = 0x02; // 使能中断
PWMA_CR1 = 0x01; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}
//========================================================================
// 函数: void PWMA_ISR(void) interrupt PWMA_VECTOR
// 描述: PWMA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-6-1
//========================================================================
void PWMA_ISR(void) interrupt PWMA_VECTOR
{
if(PWMA_SR1 & 0x02) //编码器中断
{
PWMA_SR1 &= ~0x02;
pulse = PWMA_CNTR; //读取当前编码器计数值
B_Change = 1; //标志已有捕捉值
}
}
Yim_Hom
发表于 2025-2-22 00:46:53
我的用户名 发表于 2025-2-21 15:42
有清中断的,估计是配置不对,读不到脉冲数值,我没有STC32的MCU,我用的是STC8H1K08 SOP16,估计是PWM配置 ...
我这个也是8h系列,不是stc32.
梁工
发表于 2025-2-22 11:50:22
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器了。
使用PWMB的P1.7、P5.4可以接编码器,你试试。
我的用户名
发表于 2025-2-22 15:00:16
Yim_Hom 发表于 2025-2-22 00:46
我这个也是8h系列,不是stc32.
非常感谢前辈不厌其烦的帮助,谢谢!
我的用户名
发表于 2025-2-22 15:02:20
梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...
感谢梁老师的指导,我去试试,谢谢!
Yim_Hom
发表于 2025-2-22 15:30:39
梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...
梁工,我是一点点抠手册看的回答这个问题,没在手册里看到这句备注。。。
Yim_Hom
发表于 2025-2-22 15:31:06
我的用户名 发表于 2025-2-22 15:00
非常感谢前辈不厌其烦的帮助,谢谢!
正好写过这个。。。这不,还没帮上忙。。。
我的用户名
发表于 2025-2-22 15:37:47
Yim_Hom 发表于 2025-2-22 15:30
梁工,我是一点点抠手册看的回答这个问题,没在手册里看到这句备注。。。 ...
我看了手册加上实验不行之后有点怀疑这个,但是不敢确认,所以才发帖求助的
我的用户名
发表于 2025-2-22 15:41:09
Yim_Hom 发表于 2025-2-22 15:31
正好写过这个。。。这不,还没帮上忙。。。
您客气了,您这份热心肠就值得感谢!我们新人学习“最绕人的PWM”确实需要像您这样热心肠的前辈的帮助,可以少走一些弯路{:baoquan:}
我的用户名
发表于 2025-2-22 16:01:07
梁工 发表于 2025-2-22 11:50
8H1K08是有P1.2的,但是16脚的8H1K08没有引出P1.2,而P5.4也没有PWM2P的功能,所以16脚的PWMA用不了编码器 ...
试过了,OK了,多谢梁老师的指导,谢谢!