打印
[STC单片机]

请教STC单片机的技术员,需要一个15位或16位PWM 输出任意频率任意占空比的程序

[复制链接]
1701|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 广东梁百万 于 2025-5-30 22:45 编辑

需要用STC8H1K08或者 STC8H1K28 单片机,
15位或16位PWM 输出 任意频率 任意占空比的程序,需要用单片机内置的PWM硬件产生波形。
我找了你们规格书的例程,下面这个例程只能输出10位, 我往PWMA1_CCR1,  写入16位数据,都是只有10位分辨率的输出,
写入数值超过1023就100%  了。

请教还有哪里要设置 才能有15位或16位?  12位也行。




使用特权

评论回复

相关帖子

沙发
STCMCUNT015| | 2025-5-30 15:51 | 只看该作者
本帖最后由 STCMCUNT015 于 2025-5-30 16:00 编辑

楼主可以去www.STCAIMCU.com,PWM模块提问,https://www.stcaimcu.com/forum-49-1.html  STC8H系列高级PWM程序下载地址:https://www.stcaimcu.com/thread-1779-1-1.html

使用特权

评论回复
板凳
coody| | 2025-5-31 16:26 | 只看该作者
代码的解释很清楚的:
PWMA_CCR1=100;        //设置占空比时间        
PWMA_ARR=500;        //设置周期时间

你只设置CCR1,  不改ARR,则PWM周期或频率不变,最大占空比100%,超过了不管给多大的值,都是100%!      

你要先根据PWM周期或频率,计算ARR,然后再根据占空比计算CCR1。

#define   FOSC   40000000UL
u32   frequency, period;  //PWM频率、周期
float duty;       //占空比, 0.0~1.0
u16   pscr;      //前置分频 0~65535
u16   load_period;  //装载的PWM周期数(PWM时钟数)
u16   load_duty;    //装载的PWM占空比(PWM时钟数)

period      = FOSC / frequency;  //由PWM频率计算PWM周期
pscr        = (u16)(period / 65536UL);  //计算分频系数
load_period = (u16)(period / (pscr+1)); //计算装载周期值. 当period >= 65536, 则load_period在32768~65535之间,尽量得到最精确的数值。
load_duty   = (u16)((float)load_period * duty);  //计算装载占空比值, duty为占空比0.0~1.0.

PWMA_PSCR   = pscr;         // 预分频寄存器
PWMA_ARR    = load_period;  //设置周期时间        
PWMA_CCR1   = load_duty;    //设置占空比时间        

使用特权

评论回复
地板
mwxpk| | 2025-6-3 10:26 | 只看该作者
你问的方法不对,目标条件不清楚。芯片的要求,工作频率、控制条件,输入环境,输出环境,这都对程序有要求的。选择芯片各厂都有资料,确定后的芯片都有自己的规范。芯片定下,工作电压是否有要求,是否使用外部晶体?内部时钟要求,PWM是广义词,什么样的PWM?是程序内修改PWM参数?还是外部电位器调整?屏幕调整? 你搞明白写出完整的要求后,不用问别人,AI豆包百度都能给你完成。你HEX到芯片后在电路中测试就OK

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

205

帖子

4

粉丝