找回密码
 立即注册
查看: 293|回复: 12

Ai8051U-32Bit PWM输出功能问题 | 可以了

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-18 15:43:44 | 显示全部楼层 |阅读模式
请问怎么设置在PWM波上升沿产生中断

请问怎么设置在PWM波上升沿产生中断

请问怎么设置在PWM波上升沿产生中断
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-9-18 15:48:00 | 显示全部楼层
您好,感谢您对国芯AI8051U系列芯片的关注与使用。

关于您提出的“如何在PWM波上升沿产生中断”的问题,以下将从AI8051U的PWM模块功能机制、中断配置逻辑以及具体实现步骤进行专业分析与说明,供您参考。

一、AI8051U PWM模块概述

AI8051U是国芯科技推出的一款基于增强型8051内核的32位高性能工业级微控制器,其PWM模块支持多通道、高精度波形输出,广泛应用于电机控制、电源管理、LED驱动等场景。

PWM模块支持以下关键功能:
多通道独立配置(如PWM0-PWM3)
支持上升沿、下降沿及双边沿中断触发
可配置周期与占空比
支持PWM中断源映射至CPU中断控制器

二、PWM中断机制分析

AI8051U的PWM模块内置中断控制寄存器(PWMxINTEN),用于配置PWM通道的中断使能。通常,每个PWM通道支持以下中断类型:
周期匹配中断(PWM周期结束)
比较匹配中断(占空比点触发)
上升沿中断(PWM波形从低变高)
下降沿中断(PWM波形从高变低)

因此,实现“在PWM波上升沿产生中断”,需要对PWM通道的中断使能寄存器进行配置,启用“上升沿中断”功能。

三、配置步骤详解(以PWM0为例)

以下为基于AI8051U的PWM0通道配置上升沿中断的典型流程:

1. 初始化PWM模块

配置PWM0的周期、占空比、输出极性等参数:
  1. c
  2. PWM0->LOAD = SystemCoreClock / 10000; // 假设系统时钟为1MHz,设置周期为100us
  3. PWM0->CMP = PWM0->LOAD / 2;           // 占空比50%
  4. PWM0->CTRL = PWMCTRLEN | PWMCTRLUP; // 启用PWM,向上计数模式
复制代码

2. 配置中断使能寄存器

启用PWM0的上升沿中断:
  1. c
  2. PWM0->INTEN |= PWMINTENRISE; // 使能上升沿中断
复制代码

3. 配置全局中断与中断优先级

将PWM0中断映射至NVIC并设置优先级:
  1. c
  2. NVICEnableIRQ(PWM0IRQn);
  3. NVICSetPriority(PWM0IRQn, 1);
复制代码

4. 编写中断服务函数

在中断服务函数中,需清除中断标志以避免重复触发:
  1. c
  2. void PWM0IRQHandler(void) {
  3.     if (PWM0->INTSTAT & PWMINTSTATRISE) {
  4.         // 处理上升沿中断事件
  5.         PWM0->INTCLR = PWMINTCLRRISE; // 清除上升沿中断标志
  6.     }
  7. }
复制代码

四、注意事项

1. 中断触发条件:确保PWM处于运行状态,且配置为“向上计数”模式,否则上升沿可能无法正确识别。
2. 中断标志清除:务必在中断处理中清除对应中断标志位,否则中断将不断重复触发。
3. GPIO配置:若需输出PWM波形,应确保对应的GPIO引脚配置为PWM复用功能。
4. 调试建议:可通过示波器观察PWM输出波形,并使用调试器查看中断是否正常进入。

五、总结

AI8051U通过其灵活的PWM中断机制,可支持在PWM波形的上升沿、下降沿或周期结束时产生中断。用户只需合理配置PWMxINTEN寄存器并编写对应的中断服务函数,即可实现所需功能。

如需进一步了解PWM模块的寄存器细节或中断优先级配置,请参考《AI8051U Technical Reference Manual》第12章“PWM模块”部分。

如您在实际开发过程中遇到具体问题,欢迎继续提问,我们将持续为您提供技术支持。

祝您开发顺利!

国芯人工智能技术支持团队  
2025年4月5日

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-18 16:43:14 | 显示全部楼层
看这个输出是ccr几,例如是ccr1输出的,就在pwma_ier中,打开ccr1的比较中断,就可以了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-18 17:31:11 | 显示全部楼层
王*** 发表于 2025-9-18 16:43
看这个输出是ccr几,例如是ccr1输出的,就在pwma_ier中,打开ccr1的比较中断,就可以了 ...

是ccr1,但还是不明白呀,大佬

点评

[attachimg]115567[/attachimg] 将这个标志位置1,也就是PWMA_IER |= 0x02; 然后在PWM中断里面判断这个标志位: [attachimg]115569[/attachimg] 判断完成后,在PWM中断的最后记得清除状态寄存器就行了,可以参考PWM  详情 回复 发表于 2025-9-18 18:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-18 18:28:51 | 显示全部楼层
mfsl*** 发表于 2025-9-18 17:31
是ccr1,但还是不明白呀,大佬

截图202509181827138955.jpg

将这个标志位置1,也就是PWMA_IER |= 0x02;
然后在PWM中断里面判断这个标志位:
截图202509181828014018.jpg
判断完成后,在PWM中断的最后记得清除状态寄存器就行了,可以参考PWM使能更新中断的程序,然后增加一下CC1比较中断就可以了

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-18 18:54:49 | 显示全部楼层
王*** 发表于 2025-9-18 18:28
将这个标志位置1,也就是PWMA_IER |= 0x02;
然后在PWM中断里面判断这个标志位:

我根据
Ai8051U实验箱V1.2\Ai8051U-32Bit\30-红外发射程序(NEC码)-使用PWM4产生38KHz载波\C语言
例程来改,但波形的空闲电平不一样,例程空闲是低,修改的空闲是高,请问是哪里的问题
egP27.png
myP20.png

main_myP20.c

10.34 KB, 下载次数: 6

main_egP27.c

10.33 KB, 下载次数: 4

点评

一般是输出极性错了,但是你既然都输出了,那改起来比较麻烦 [attachimg]115578[/attachimg] 直接改这个就行了 [attachimg]115579[/attachimg] 原来是强制为低,你改成强制为高就行了 PWMA_CCMR1 = 0x50;这样就可以  详情 回复 发表于 2025-9-18 19:23
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-18 19:23:05 | 显示全部楼层
mfsl*** 发表于 2025-9-18 18:54
我根据
Ai8051U实验箱V1.2\Ai8051U-32Bit\30-红外发射程序(NEC码)-使用PWM4产生38KHz载波\C语言
例程来改 ...

一般是输出极性错了,但是你既然都输出了,那改起来比较麻烦

截图202509181921562254.jpg
直接改这个就行了
截图202509181922046890.jpg
原来是强制为低,你改成强制为高就行了
PWMA_CCMR1 = 0x50;这样就可以了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-19 09:23:36 | 显示全部楼层
王*** 发表于 2025-9-18 19:23
一般是输出极性错了,但是你既然都输出了,那改起来比较麻烦

为什么Demo程序这里是0x40又是低空闲,高有效呢?还有没明白“但是你既然都输出了,那改起来比较麻烦” 是什么意思?

点评

你的波形跟那个参考的是反的,这个极性是修改CCER1中的极性位实现的。 你改动后是不是空闲电平变成0了? 我的意思是,你这个既然都能正常输出了,里面包括CCER1的地方太多,不如只改这一处。 如果不能用的话,建议还  详情 回复 发表于 2025-9-19 09:26
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-19 09:26:32 | 显示全部楼层
mfsl*** 发表于 2025-9-19 09:23
为什么Demo程序这里是0x40又是低空闲,高有效呢?还有没明白“但是你既然都输出了,那改起来比较麻烦”  ...

你的波形跟那个参考的是反的,这个极性是修改CCER1中的极性位实现的。
你改动后是不是空闲电平变成0了?
我的意思是,你这个既然都能正常输出了,里面包括CCER1的地方太多,不如只改这一处。
如果不能用的话,建议还是改极性
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-10-14 09:38:06
已绑定手机

13

主题

43

回帖

185

积分

注册会员

积分
185
发表于 2025-9-19 09:34:13 | 显示全部楼层
王*** 发表于 2025-9-19 09:26
你的波形跟那个参考的是反的,这个极性是修改CCER1中的极性位实现的。
你改动后是不是空闲电平变成0了?
...

1、改了CCMR1后是空闲为0了;也用了修改CCER1的方法可行。我现在只是用这个Demo先调,好了后再移植。

2、Demo用的24M测出来的载波是38kHz(26.4us),那用40M呢怎么输出38kHz(26.4us)?

点评

调整一下分频值就行了,具体可以参考PWM部分的频率计算公式  详情 回复 发表于 2025-9-19 10:23
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:03 , Processed in 0.137611 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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