标题: STC8A单片机PWM问题研究 [打印本页]

作者: hmgqljz111    时间: 2019-5-18 16:37
标题: STC8A单片机PWM问题研究
最近看到STC8a8k64S2A,研究了几天的DATASHEET,就是无法实现任意周期和任意
占空比的波形输出,不知道是我太笨,还是这个芯片无法实现这个功能。
版主能否放个例程出来?

附STC8A的相关例程:
void main()
{
    P_SW2 = 0x80;
    PWMCKS = 0x00;                              // PWM时钟为系统时钟
    PWMC = 0x1
        000;                              //设置PWM周期为1000H个PWM时钟
    PWM0T1= 0x0100;                             //在计数值为100H地方输出低电平
    PWM0T2= 0x0500;                             //在计数值为500H地方输出高电平
    PWM0CR= 0x80;                               //使能PWM0输出
    P_SW2 = 0x00;

    PWMCR = 0x80;                               //启动PWM模块

    while (1);
}

作者: hmgqljz111    时间: 2019-5-18 16:38
P_SW2的第七位也置1了,可是还是无法输出波形
作者: gujp312365    时间: 2019-5-22 14:45
你写的程序很混乱,根据我对这个料的研究,你需要按以下的步骤仔细去做,我也在研究中。
void  Pcapwm_Init(void)
{  //1初始化PCA模块的控制寄存器 CCON
   CCON = 0x00;
   //2初始化PCA模块的模式寄存器 CMOD
   CMOD = 0x08; //初始化PCA模块时钟选择为SYS系统时钟
   //3 初始化PCA模块的计数器(清空)
   CL = 0;
   CH = 0;
   // 4 初始化PCA模块n模式控制寄存器CCAPMn, ECOMn和PWMn位必须置1
   CCAPM0 |= 0x42;   //0100 0010
   CCAPM1 |= 0x42;
   CCAPM2 |= 0x42;
   CCAPM3 |= 0x42;
   //5 设置 PCA模块n的PWM模式控制寄存器 PCA_PWMn的PWM模式
   PCA_PWM0 |= 0x80; //6位PWM模式
   PCA_PWM1 |= 0x40;// 7位PWM模式
   PCA_PWM2 |= 0x00;// 8位PWM模式
   PCA_PWM2 |= 0xC0;// 10位PWM模式
   //6 设置PCA模块n模式捕获值/比较值寄存器CCAPnL, CCAPnH
   CCAP0L = 0x20;  //占空比50%
CCAP0H = 0x20;

CCAP1L = 0x20;  //占空比75%  7位周期,那么最大是80H,那么高电平的时间为60H。
CCAP1H = 0x20;

CCAP2L = 0x20;  //占空比87.5%  8位周期,那么最大是100H,那么高电平的时间为E0H。
CCAP2H = 0x20;

CCAP3L = 0x20;  //占空比96.875%  8位周期,那么最大是400H,那么高电平的时间为3E0H。
CCAP3H = 0x20;  //992/1024 = 96.875
// 7 开启PCA计数器允许
CR = 1;
}

作者: hmgqljz111    时间: 2019-5-22 15:40
gujp312365 发表于 2019-5-22 14:45
你写的程序很混乱,根据我对这个料的研究,你需要按以下的步骤仔细去做,我也在研究中。
void  Pcapwm_Ini ...

这个不是我 写的,是STC的官方的,我就是调试不通
作者: hmgqljz111    时间: 2019-5-22 15:42
gujp312365 发表于 2019-5-22 14:45
你写的程序很混乱,根据我对这个料的研究,你需要按以下的步骤仔细去做,我也在研究中。
void  Pcapwm_Ini ...

谢谢您的回复,我看的是增强型PWM,手册398页。
作者: 幻剑心    时间: 2019-5-22 17:51
这个可以输出任意波形的pwm 。是不是你前面的那些sfr和define没写。或者是PWMC = 0x1(在这多了回车)000 导致的。
作者: 幻剑心    时间: 2019-5-22 18:12
1000H 也就是4096个时钟周期,选择的是系统时钟1,频率大约在16M-30M。为了计算,取24M进行计算。
作者: 幻剑心    时间: 2019-5-22 18:19
也就是PWM一整个周期的频率为:24M/4096=5.9K左右。暂空比:1024(500H-100H)/4096=25%。
作者: 幻剑心    时间: 2019-5-22 18:21
PWM一个周期的波形:6.25%高电平----25%低电平-----68.75%高电平。
作者: 幻剑心    时间: 2019-5-22 18:23
这样示波器调到5.8K左右就能看到波形。如果调到M级别的就看不到了。
作者: lyq2369353531    时间: 2019-5-23 16:08
官方是可以的
作者: hmgqljz111    时间: 2019-8-9 07:26
这个程序是可以的,只是在keil里仿真看不到,刷进单片机,用示波器是可以测出来,我实验过了
作者: shzhge    时间: 2021-12-25 16:38
问题在于:你直接复制了PWMCKS的地址,地址应该是0xfff2,复制后少了1个f,变成0xff2,修改值不能写入PWMCKS。PWM能运行输出,就是不能修改周期。
作者: npn    时间: 2021-12-25 20:31
hmgqljz111 发表于 2019-8-9 07:26
这个程序是可以的,只是在keil里仿真看不到,刷进单片机,用示波器是可以测出来,我实验过了

硬件PWM 寄存器都是 STC最近几年自己加进去的,Keil 只能按照 AT89 仿真,它不支持的寄存器,中断,仿真不出来。
作者: univers    时间: 2021-12-25 21:33
官方例程肯定可以的。
作者: 风之痕于梦想    时间: 2021-12-30 15:45
这是没问题的,在开发板测试可以
作者: wufa1986    时间: 2021-12-31 11:14
无需自己写点,开官方烧录软件,例程直接复制
作者: huangaw0308    时间: 2023-9-11 14:11
我也一样,在上STC8A8K64D 使用样例 P2.0 输出不了波形。示波器上也无输出。 你是如何解决的。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1