找回密码
 立即注册
查看: 2292|回复: 3

STC8A8K64D4的PWM输出问题

[复制链接]

该用户从未签到

6

主题

16

回帖

88

积分

注册会员

积分
88
发表于 2023-4-16 16:18:21 | 显示全部楼层 |阅读模式
现在想使用该芯片产生两路互补的PWM信号,始终无法实现。
翻阅手册的时候,发现以下代码
STC8A8K64D4的PWM输出问题-1.png STC8A8K64D4的PWM输出问题-2.png STC8A8K64D4的PWM输出问题-3.png STC8A8K64D4的PWM输出问题-4.png


由于数据手册无法复制,于是去ISP中复制,却发现ISP中的代码示例寄存器的地址与手册中的不符。下面是ISP中的范例程序:


#include "reg51.h"
#include "intrins.h"

//测试工作频率为11.0592MHz

sfr     P_SW2       =   0xba;
sfr     PWMCFG      =   0xf1;
sfr     PWMIF       =   0xf6;
sfr     PWMFDCR     =   0xf7;
sfr     PWMCR       =   0xfe;

#define PWMC            (*(unsigned int volatile xdata *)0xfff0)
#define PWMCKS          (*(unsigned char volatile xdata *)0xfff2)
#define TADCP           (*(unsigned int volatile xdata *)0xfff3)
#define PWM0T1          (*(unsigned int volatile xdata *)0xff00)
#define PWM0T2          (*(unsigned int volatile xdata *)0xff02)
#define PWM0CR          (*(unsigned char volatile xdata *)0xff04)
#define PWM0HLD         (*(unsigned char volatile xdata *)0xff05)
#define PWM1T1          (*(unsigned int volatile xdata *)0xff10)
#define PWM1T2          (*(unsigned int volatile xdata *)0xff12)
#define PWM1CR          (*(unsigned char volatile xdata *)0xff14)
#define PWM1HLD         (*(unsigned char volatile xdata *)0xff15)
#define PWM2T1          (*(unsigned int volatile xdata *)0xff20)
#define PWM2T2          (*(unsigned int volatile xdata *)0xff22)
#define PWM2CR          (*(unsigned char volatile xdata *)0xff24)
#define PWM2HLD         (*(unsigned char volatile xdata *)0xff25)
#define PWM3T1          (*(unsigned int volatile xdata *)0xff30)
#define PWM3T2          (*(unsigned int volatile xdata *)0xff32)
#define PWM3CR          (*(unsigned char volatile xdata *)0xff34)
#define PWM3HLD         (*(unsigned char volatile xdata *)0xff35)
#define PWM4T1          (*(unsigned int volatile xdata *)0xff40)
#define PWM4T2          (*(unsigned int volatile xdata *)0xff42)
#define PWM4CR          (*(unsigned char volatile xdata *)0xff44)
#define PWM4HLD         (*(unsigned char volatile xdata *)0xff45)
#define PWM5T1          (*(unsigned int volatile xdata *)0xff50)
#define PWM5T2          (*(unsigned int volatile xdata *)0xff52)
#define PWM5CR          (*(unsigned char volatile xdata *)0xff54)
#define PWM5HLD         (*(unsigned char volatile xdata *)0xff55)
#define PWM6T1          (*(unsigned int volatile xdata *)0xff60)
#define PWM6T2          (*(unsigned int volatile xdata *)0xff62)
#define PWM6CR          (*(unsigned char volatile xdata *)0xff64)
#define PWM6HLD         (*(unsigned char volatile xdata *)0xff65)
#define PWM7T1          (*(unsigned int volatile xdata *)0xff70)
#define PWM7T2          (*(unsigned int volatile xdata *)0xff72)
#define PWM7CR          (*(unsigned char volatile xdata *)0xff74)
#define PWM7HLD         (*(unsigned char volatile xdata *)0xff75)

void main()
{
    P_SW2 = 0x80;
    PWMCKS = 0x00;                              // PWM时钟为系统时钟
    PWMC = 0x0800;                              //设置PWM周期为0800H个PWM时钟
    PWM0T1= 0x0100;                             //PWM0在计数值为100H地方输出低电平
    PWM0T2= 0x0700;                             //PWM0在计数值为700H地方输出高电平
    PWM1T2= 0x0080;                             //PWM1在计数值为0080H地方输出高电平
    PWM1T1= 0x0780;                             //PWM1在计数值为0780H地方输出低电平
    PWM0CR= 0x80;                               //使能PWM0输出
    PWM1CR= 0x80;                               //使能PWM1输出
    P_SW2 = 0x00;

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

    while (1);
}


上述代码尝试后无法输出PWM。
现在已经彻底被搞晕了。。。

回复 送花

使用道具 举报

该用户从未签到

552

主题

9532

回帖

1万

积分

管理员

积分
14106
发表于 2023-4-16 18:19:52 | 显示全部楼层
于是去ISP中复制=======ISP 的范例程序中的程序是STC8A8K64S4A12的,不是STC8A8K64D4的
1.png


你下载下面这个
2.png

第44个演示程序 SPWM
3.png

回复 支持 反对 送花

使用道具 举报

该用户从未签到

6

主题

16

回帖

88

积分

注册会员

积分
88
 楼主| 发表于 2023-4-16 21:06:00 | 显示全部楼层
神农鼎 发表于 2023-4-16 18:19
于是去ISP中复制=======ISP 的范例程序中的程序是STC8A8K64S4A12的,不是STC8A8K64D4的

这里提示关闭中断,中断标志位仍然会被置1,那我还需要进行软件清零吗

1.png

回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

3044

回帖

6863

积分

超级版主

积分
6863
发表于 2023-4-19 12:58:14 | 显示全部楼层
02-2路互补输出SPWM-C语言


/*************        功能说明        **************
请先别修改程序, 直接下载HEX文件测试
本程序从P2.0(PWM0)输出正相PWM, 从P2.1(PWM1)输出反相(互补)PWM带死区.
演示使用2路PWM产生互补或同相的SPWM.

主时钟选择24MHZ, PWM时钟选择1T, PWM周期2400, PWM频率10KHz, 死区12个时钟(0.5us).正弦波表用200点.

输出正弦波频率 = 24000000 / 2400 / 200 = 50 HZ.

本程序仅仅是一个SPWM的演示程序, 用户可以通过上面的计算方法修改PWM周期和正弦波的点数和幅度.

本程序输出频率固定, 如果需要变频, 请用户自己设计变频方案.



1.png

2.png

3.png

4.png

5.png

用STC8A8K64D4系列的15位增强型输出2路互补SPWM.pdf (200.89 KB, 下载次数: 56)

STC8A8K64D4-增强型15位PWM相关程序.zip (267.38 KB, 下载次数: 53)


回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-20 06:25 , Processed in 0.063543 second(s), 43 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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