找回密码
 立即注册
楼主: zhp

AiCube-ISP, 图形化程序自动生成,【高级PWM-DMA自动产生互补SPWM波形】的代码

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:439
  • 最近打卡:2026-04-30 22:16:09
已绑定手机

1

主题

139

回帖

467

积分

中级会员

积分
467
发表于 2026-3-27 21:25:52 | 显示全部楼层
还有其他方面的应用例程吗
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:124
  • 最近打卡:2026-04-30 15:01:28
已绑定手机

1

主题

54

回帖

227

积分

中级会员

积分
227
发表于 2026-3-28 16:27:29 | 显示全部楼层
赞赞赞
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 09:51:28 | 显示全部楼层
版主好,我用STC32G144K246芯片,按照您的步骤,生成项目后编译的时候有报错:

主要是2个变量没有定义:

\01_M51S-L6-ZL-V1R00\LX\02-PWMA\Sources\inc\pwm.h(80): error C67: 'PWMA_DMATXSIZE': undefined identifier

Sources\pwm.c(67): error C67: 'PWMA_DMAITV': undefined identifier

我看第一个变量是DMA发送缓冲器长度,第二个PWMA_DMAITV 就没看懂

//<<AICUBE_USER_DEFINE_BEGIN>>
// 在此添加用户宏定义
#define PWMA_DMATXSIZE  40
#define PWMA_DMAITV 40
//<<AICUBE_USER_DEFINE_END>>
这样可以么?

我看生成的程序中有这样一句:
DMA_PWMA_SetInterval(PWMA_DMAITV);  //设置PWMA发送DMA字节间隔时间(系统时钟)

那么就应该是:
//<<AICUBE_USER_DEFINE_BEGIN>>
// 在此添加用户宏定义
#define PWMA_DMATXSIZE  40
#define PWMA_DMAITV 0
//<<AICUBE_USER_DEFINE_END>>

依据是:PWM发送DMA间隔时间 0

不知道这样理解妥否?

我是用STC ISP 6.96V版本,能否把这个错误反馈给STC AiCube 的开发工程师?
截图202604190938534998.jpg
截图202604190950409123.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 10:00:49 | 显示全部楼层
另外,请教一下,如何在主函数中调用////////////////////////////////////////
// 设置PWM通道输出占空比
// 入口参数: PWMx: (目标PWM组和通道索引)
//           fDuty: (占空比值/百分比值,范围:0.0f~100.0f)
//           iMode: (PWM输出模式:PWM_MODE1/PWM_MODE2)
// 函数返回: 无
////////////////////////////////////////
void PWM_UpdateDuty(uint8_t PWMx, float fDuty, uint8_t iMode)

来临时改变占空比?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 10:20:45 | 显示全部楼层
还是不行,这样就是正常通过了编译,但是P10P11没有PWMA波形输出:
截图202604191020421739.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 10:24:19 | 显示全部楼层
我明白了,还要在主函数调用:

仔细想一下,在PWMA初始化的时候,不是已经执行这2句了么?为什么如果主函数不再一次执行这2句,就没有波形输出?
  1. void main(void)
  2. {
  3.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  4.     // 在此添加用户主函数初始化代码  
  5.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  6.     SYS_Init();
  7.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  8.     // 在此添加主函数中运行一次的用户代码  
  9.     //<<AICUBE_USER_MAIN_CODE_END>>
  10.     while (1)
  11.     {
  12.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  13.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  14.         // 在此添加主函数中用户主循环代码
  15.                 PWM_UpdateDuty(PWMA_CH1, 400);      //设置通道的PWM占空比
  16.                 PWMA_Run();                         //PWMA开始运行
  17.         //<<AICUBE_USER_MAIN_LOOP_END>>
  18.     }
  19. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 10:26:26 | 显示全部楼层
这样就靠谱:

的确的PWMA的通道1  输出互补的2个占空比39.96%的PWM波
截图202604191025224391.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2026-04-22 17:04:41
已绑定手机

22

主题

2500

回帖

3086

积分

论坛元老

积分
3086
发表于 2026-4-19 11:11:16 | 显示全部楼层
还有个疑问:

//<<AICUBE_USER_DEFINE_BEGIN>>
// 在此添加用户宏定义
#define PWMA_DMATXSIZE  40
#define PWMA_DMAITV 0
//<<AICUBE_USER_DEFINE_END>>

数据对齐:
确保内存缓冲区的数据类型(uint16_t 或 uint32_t)与 DMA 配置的数据宽度(Half Word / Word)完全一致,否则会导致数据错位或传输错误。

我们在AiCube 中,确定了DMA每次突发传输字节数 是2字节

那么是否应该这样:

//<<AICUBE_USER_DEFINE_BEGIN>>
// 在此添加用户宏定义
#define PWMA_DMATXSIZE  16
#define PWMA_DMAITV 0
//<<AICUBE_USER_DEFINE_END>>

请版主指教。。。。。。。。。

好像#define PWMA_DMATXSIZE  16 会影响生成的PWMA波形,其中绝大部分都是60%的占空比,但是

有1个周期是50%?


截图202604191253435755.jpg
截图202604191255494935.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 10:33 , Processed in 0.121502 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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