找回密码
 立即注册
查看: 59|回复: 5

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

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

1

主题

0

回帖

9

积分

新手上路

积分
9
发表于 3 天前 | 显示全部楼层 |阅读模式
需要用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




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-02 00:02:56
已绑定手机

5

主题

70

回帖

981

积分

高级会员

积分
981
发表于 前天 00:18 | 显示全部楼层
如图
截图202505310018052703.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-02 00:02:56
已绑定手机

5

主题

70

回帖

981

积分

高级会员

积分
981
发表于 前天 00:27 | 显示全部楼层
ARR是控制周期的
CCR1控制的是占空比

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:86
  • 最近打卡:2025-06-02 08:20:30

729

主题

1万

回帖

1万

积分

管理员

积分
16235
发表于 前天 14:10 | 显示全部楼层
截图202505311410125368.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-06-01 10:11:07
已绑定手机
已实名认证

110

主题

2332

回帖

5830

积分

版主

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:81
  • 最近打卡:2025-06-02 13:37:13

74

主题

6017

回帖

1万

积分

超级版主

积分
12522
发表于 前天 16:22 | 显示全部楼层
代码的解释很清楚的:
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;    //设置占空比时间        
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-2 20:43 , Processed in 0.171496 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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