找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5932|回复: 17
收起左侧

STC8A单片机PWM问题研究

  [复制链接]
ID:230975 发表于 2019-5-18 16:37 | 显示全部楼层 |阅读模式
最近看到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);
}
回复

使用道具 举报

ID:230975 发表于 2019-5-18 16:38 | 显示全部楼层
P_SW2的第七位也置1了,可是还是无法输出波形
回复

使用道具 举报

ID:142320 发表于 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;
}
回复

使用道具 举报

ID:230975 发表于 2019-5-22 15:40 | 显示全部楼层
gujp312365 发表于 2019-5-22 14:45
你写的程序很混乱,根据我对这个料的研究,你需要按以下的步骤仔细去做,我也在研究中。
void  Pcapwm_Ini ...

这个不是我 写的,是STC的官方的,我就是调试不通
回复

使用道具 举报

ID:230975 发表于 2019-5-22 15:42 | 显示全部楼层
gujp312365 发表于 2019-5-22 14:45
你写的程序很混乱,根据我对这个料的研究,你需要按以下的步骤仔细去做,我也在研究中。
void  Pcapwm_Ini ...

谢谢您的回复,我看的是增强型PWM,手册398页。
回复

使用道具 举报

ID:511890 发表于 2019-5-22 17:51 | 显示全部楼层
这个可以输出任意波形的pwm 。是不是你前面的那些sfr和define没写。或者是PWMC = 0x1(在这多了回车)000 导致的。
回复

使用道具 举报

ID:511890 发表于 2019-5-22 18:12 | 显示全部楼层
1000H 也就是4096个时钟周期,选择的是系统时钟1,频率大约在16M-30M。为了计算,取24M进行计算。
回复

使用道具 举报

ID:511890 发表于 2019-5-22 18:19 | 显示全部楼层
也就是PWM一整个周期的频率为:24M/4096=5.9K左右。暂空比:1024(500H-100H)/4096=25%。
回复

使用道具 举报

ID:511890 发表于 2019-5-22 18:21 | 显示全部楼层
PWM一个周期的波形:6.25%高电平----25%低电平-----68.75%高电平。
回复

使用道具 举报

ID:511890 发表于 2019-5-22 18:23 | 显示全部楼层
这样示波器调到5.8K左右就能看到波形。如果调到M级别的就看不到了。
回复

使用道具 举报

ID:229240 发表于 2019-5-23 16:08 | 显示全部楼层
官方是可以的
回复

使用道具 举报

ID:230975 发表于 2019-8-9 07:26 | 显示全部楼层
这个程序是可以的,只是在keil里仿真看不到,刷进单片机,用示波器是可以测出来,我实验过了
回复

使用道具 举报

ID:53883 发表于 2021-12-25 16:38 | 显示全部楼层
问题在于:你直接复制了PWMCKS的地址,地址应该是0xfff2,复制后少了1个f,变成0xff2,修改值不能写入PWMCKS。PWM能运行输出,就是不能修改周期。
回复

使用道具 举报

ID:57657 发表于 2021-12-25 20:31 | 显示全部楼层
hmgqljz111 发表于 2019-8-9 07:26
这个程序是可以的,只是在keil里仿真看不到,刷进单片机,用示波器是可以测出来,我实验过了

硬件PWM 寄存器都是 STC最近几年自己加进去的,Keil 只能按照 AT89 仿真,它不支持的寄存器,中断,仿真不出来。
回复

使用道具 举报

ID:382454 发表于 2021-12-25 21:33 来自手机 | 显示全部楼层
官方例程肯定可以的。
回复

使用道具 举报

ID:893997 发表于 2021-12-30 15:45 | 显示全部楼层
这是没问题的,在开发板测试可以
回复

使用道具 举报

ID:879348 发表于 2021-12-31 11:14 | 显示全部楼层
无需自己写点,开官方烧录软件,例程直接复制
回复

使用道具 举报

ID:448520 发表于 2023-9-11 14:11 | 显示全部楼层
我也一样,在上STC8A8K64D 使用样例 P2.0 输出不了波形。示波器上也无输出。 你是如何解决的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表