找回密码
 立即注册
查看: 1359|回复: 10

8H 需要一个15位或16位PWM 输出任意频率任意占空比的程序

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-30 20:56:54
已绑定手机

1

主题

0

回帖

11

积分

新手上路

积分
11
发表于 2025-5-30 20:56:54 | 显示全部楼层 |阅读模式
需要用8H1K08或者 8H1K28 单片机,
15位或16位分辨率的PWM 输出, 任意频率 任意占空比的程序,需要用单片机内置的PWM硬件产生波形。
我找了规格书的例程,按下面图片这个例程修改了一下,只能
10位分辨率的输出,
我往PWMA1_CCR1,  写入16位数据,都是只有10位分辨率的输出,
写入数值超过1023就100%  了。


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






PWMA_PS=0xF0;  //P10输出PWMA1P, P11输出PWMA1N,
PWMA_CCER1=0x00;        //写CCMRx 前必须先清零CCERx 关闭通道        
PWMA_CCMR1=0x68;        //设置CC1 为PWMA输出模式        ,寄存器预装载
PWMA_CCER1=0x01;        //使能CC1 通道        
PWMA_CCR1=100;        //设置占空比时间        
PWMA_ARR=500;        //设置周期时间        
PWMA_ENO=0x01;        //使能PWM1P 端口输出        、
PWMA_BKR=0x80;        //使能主输出        
PWMA_CR1=0x01;        //开始计时





120625xullzrslcrzgp6s2.png.thumb.png




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2026-03-21 00:27:25
已绑定手机

14

主题

228

回帖

2798

积分

金牌会员

积分
2798
发表于 2025-5-31 00:18:38 | 显示全部楼层
如图
截图202505310018052703.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2026-03-21 00:27:25
已绑定手机

14

主题

228

回帖

2798

积分

金牌会员

积分
2798
发表于 2025-5-31 00:27:04 | 显示全部楼层
ARR是控制周期的
CCR1控制的是占空比

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2025-5-31 14:10:17 | 显示全部楼层
截图202505311410125368.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:693
  • 最近打卡:2026-03-21 14:40:05
已绑定手机
已实名认证

130

主题

3383

回帖

8815

积分

版主

积分
8815
发表于 2025-5-31 15:20:21 | 显示全部楼层
频率和分辨率是互相牵制的关系
如果频率较高,那么分辨率就做不了很高
如果分辨率较高,那么频率就没法做到很高
使用PWMA_ARR = 0xffff;即可实现16位的分辨率,但此时的频率就比较低了
占空比则是使用PWMA_CCR1来控制,范围是0~PWMA_ARR
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:307
  • 最近打卡:2026-03-19 10:21:34

84

主题

7299

回帖

1万

积分

超级版主

积分
15676
发表于 2025-5-31 16:22:44 | 显示全部楼层
代码的解释很清楚的:
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;    //设置占空比时间        
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-11 12:39:46
已绑定手机

0

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2026-1-15 19:55:12 | 显示全部楼层
设置不同ARR,确实可以得到不同的频率,但是相同的ARR值也可能得到不同的频率值,所以信号在接到频率计上会发现,设置了ARR后,有时输出的频率值来回跳动,不稳定。
比如:FOSC=24M,PWMA_CCR1=PWMA_ARR/2
看如下计算,取整后的相同的ARR值对应了不同的频率值。我想请教下各位,有没有方法解决这个问题,频率可以以1Hz为步长增加,而且不会来回跳动?(因为设置了ARR值后,对应出了不同的频率值)
截图202601151951408211.jpg

点评

使用内部时钟,会有0.3%之内的波动,你要稳定,一定要使用外部晶振,这样输出频率的稳定度和精确度跟晶振一样,比如使用0.1ppm的晶振,能得到年误差为3秒的频率。  详情 回复 发表于 2026-1-16 23:39
要使用高精度的外部晶振。  详情 回复 发表于 2026-1-16 20:05
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:821
  • 最近打卡:2026-03-21 09:40:50

24

主题

543

回帖

1885

积分

荣誉版主

积分
1885
发表于 2026-1-16 20:05:34 | 显示全部楼层
whc*** 发表于 2026-1-15 19:55
设置不同ARR,确实可以得到不同的频率,但是相同的ARR值也可能得到不同的频率值,所以信号在接到频率计上会 ...

要使用高精度的外部晶振。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:307
  • 最近打卡:2026-03-19 10:21:34

84

主题

7299

回帖

1万

积分

超级版主

积分
15676
发表于 2026-1-16 23:39:09 | 显示全部楼层
whc*** 发表于 2026-1-15 19:55
设置不同ARR,确实可以得到不同的频率,但是相同的ARR值也可能得到不同的频率值,所以信号在接到频率计上会 ...

使用内部时钟,会有0.3%之内的波动,你要稳定,一定要使用外部晶振,这样输出频率的稳定度和精确度跟晶振一样,比如使用0.1ppm的晶振,能得到年误差为3秒的频率。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-11 12:39:46
已绑定手机

0

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2026-1-18 09:55:52 | 显示全部楼层
梁*** 发表于 2026-1-16 23:39
使用内部时钟,会有0.3%之内的波动,你要稳定,一定要使用外部晶振,这样输出频率的稳定度和精确度跟晶振 ...

梁工,你好,这个跳动和时钟精度没有关系,因为使用内部时钟,几百HZ频率输出时的时候,精度很高,频率步进1HZ没有问题。看我的表格计算结果,但是当需要输出1万HZ以上时,这个时候,频率步进1hz,对应的ARR没有变化,这样在设置ARR参数时,相同的ARR值,对应了不同的输出频率值,没有办法步进1HZ,输出的频率在这几个频率值之间来回跳动。我认为,和ARR取整后得到了一样的值有关系,有没有好的方案解决这个问题,可以让输出的频率值步进1HZ增加。

点评

那你的描述不正确,我逐个说明: 1、“相同的ARR值也可能得到不同的频率值”。 PWM频率 = PWM时钟 / (ARR-1),可见这是一个数字分频,输出频率与主频的稳定度、精度一致,只要你的主频稳定,ARR值是对应的唯一频  详情 回复 发表于 2026-1-18 11:50
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-21 23:04 , Processed in 0.120291 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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