找回密码
 立即注册
查看: 522|回复: 7

AI8H8K64U

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-06-28 14:48:21
已绑定手机

2

主题

1

回帖

16

积分

新手上路

积分
16
发表于 2025-4-16 11:02:43 | 显示全部楼层 |阅读模式
请教一下 我现在输出 1-3P  PWM输出 采样中间对齐的模式 怎么实现在 高电平的中间开启ADC采样 或者DMA采样得到数据  下面是配置文件 采用中央对齐模式二  还要一个问题就是当进入ADC中断 采用一个通道的数据后 在开启DMA,然后进入中断采完数据的时间很长
1744772383367.png 1744772447796.png
回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-4-16 11:03:00 | 显示全部楼层
在实现高电平中间开启ADC采样或DMA采样的过程中,首先需要明确PWM输出和ADC采样的时序关系。以下是针对STC8H8K64U微控制器的配置和实现步骤:

1. PWM输出配置
采用中央对齐模式二(Center-Aligned Mode 2),PWM信号会在高电平的中间位置产生一个对称的波形。这种模式下,PWM的计数器会从0递增到最大值,然后再递减回0,形成一个对称的波形。

2. ADC采样配置
为了在高电平的中间位置开启ADC采样,可以利用PWM的计数器值来触发ADC采样。具体步骤如下:

2.1 配置PWM模块
首先,配置PWM模块为中央对齐模式二,并设置PWM的周期和占空比。假设PWM的周期为PWMPERIOD,占空比为PWMDUTY。
  1. c
  2. PWMInitTypeDef PWMInitStructure;
  3. PWMInitStructure.PWMMode = PWMModeCenterAligned2;
  4. PWMInitStructure.PWMPeriod = PWMPERIOD;
  5. PWMInitStructure.PWMDuty = PWMDUTY;
  6. PWMInit(&PWMInitStructure);
复制代码

2.2 配置ADC模块
接下来,配置ADC模块,使其在PWM计数器达到特定值时触发采样。这个特定值应该是PWM周期的一半,即PWMPERIOD / 2,这样采样点就会位于高电平的中间位置。
  1. c
  2. ADCInitTypeDef ADCInitStructure;
  3. ADCInitStructure.ADCMode = ADCModeSingle;
  4. ADCInitStructure.ADCTriggerSource = ADCTriggerSourcePWM;
  5. ADCInitStructure.ADCTriggerValue = PWMPERIOD / 2;
  6. ADCInit(&ADCInitStructure);
复制代码

2.3 配置DMA模块
如果需要使用DMA来传输ADC采样数据,可以配置DMA模块,使其在ADC采样完成后自动将数据传输到指定的内存地址。
  1. c
  2. DMAInitTypeDef DMAInitStructure;
  3. DMAInitStructure.DMAMode = DMAModeCircular;
  4. DMAInitStructure.DMAPeripheralBaseAddr = (uint32t)&ADC1->DR;
  5. DMAInitStructure.DMAMemoryBaseAddr = (uint32t)ADCDataBuffer;
  6. DMAInitStructure.DMABufferSize = ADCBUFFERSIZE;
  7. DMAInit(&DMAInitStructure);
复制代码

3. 中断处理
在ADC采样完成后,可以通过中断来处理采样数据。如果需要在中断中开启DMA,可以在ADC中断服务程序中启动DMA传输。
  1. c
  2. void ADCIRQHandler(void) {
  3.     if (ADCGetITStatus(ADCITEOC) != RESET) {
  4.         // 读取ADC采样数据
  5.         uint16t adcvalue = ADCGetConversionValue(ADC1);
  6.         
  7.         // 启动DMA传输
  8.         DMACmd(DMA1Channel1, ENABLE);
  9.         
  10.         // 清除中断标志
  11.         ADCClearITPendingBit(ADCITEOC);
  12.     }
  13. }
复制代码

4. 优化采样时间
如果发现进入ADC中断后,开启DMA并采完数据的时间较长,可以考虑以下优化措施:

4.1 减少中断处理时间
尽量减少中断服务程序中的操作,只保留必要的代码。例如,可以在中断中只读取ADC数据并启动DMA,其他处理操作可以放在主循环中。

4.2 使用DMA自动传输
通过配置DMA为循环模式,可以避免每次采样后都需要手动启动DMA传输,从而减少中断处理时间。

4.3 提高系统时钟频率
如果系统时钟频率较低,可以尝试提高系统时钟频率,以加快ADC采样和DMA传输的速度。

5. 总结
通过合理配置PWM、ADC和DMA模块,并优化中断处理流程,可以在STC8H8K64U微控制器上实现高电平中间开启ADC采样或DMA采样的功能。具体实现时,需要根据实际应用需求调整PWM周期、占空比和ADC采样触发值等参数,以达到最佳的采样效果。

希望以上内容能够帮助您解决问题。如果有任何进一步的问题,欢迎继续讨论。

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-06-28 14:48:21
已绑定手机

2

主题

1

回帖

16

积分

新手上路

积分
16
发表于 2025-4-16 11:04:22 | 显示全部楼层
我现在是 在高电平跟低电平都会进去一次
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-08-23 11:06:14

76

主题

6636

回帖

1万

积分

超级版主

积分
13863
发表于 2025-4-16 13:34:37 | 显示全部楼层
我写有STC32G系列的用PWM触发ADC,ADC中断读取结果。AI8H8K64U的PWM是一样的,您可以参考STC32G的,PWM4用于触发ADC。


PWM1P和PWM1N、PWM2P和PWM2N、PWM3P和PWM3N 输出3对互补带死区的PWM,PWM4用于触发ADC,触发时刻可以随意设置.
本例触发时刻设置为PWM2输出下降沿前6us启动ADC, ADC完成后进入ADC中断读取结果,并且取反P3.4指示ADC中断,用于示波器观察ADC完成时刻。



        PWMA_CCMR4  = 0x78;                                // 通道模式配置, PWM模式2, 预装载允许.  这个通道用于触发ADC, 可以不输出PWM波形.
        PWMA_CCR4H  = (800-24*6) /256;        // 触发ADC时刻,本例相对于PWM2占空比结束前6us自动启动ADC采样(比如采样电机电流)。
        PWMA_CCR4L  = (800-24*6) %256;
//        ccer2 |= 0x50;                        // 开启比较输出, 高电平有效
//        ps    |= (1<<6);                // 选择IO, 0:选择P1.6 P1.7, 1:选择P2.6 P2.7, 2:选择P6.6 P6.7, 3:选择P3.3 P3.4
///        eno   |= 0xc0;                        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
        PWMA_CCMR4  = 0x78;                // 通道模式配置, PWM模式2, 预装载允许.  这个通道用于触发ADC.
        PWMA_CR2   |= (7<<4);        // 触发ADC信号选择(TRG0), 1:计数器使能信号,  2:更新事件, 3:比较脉冲, 4:比较OC1REF, 5:比较OC2REF, 6:比较OC3REF, 7:比较OC4REF.


09C-STC32G12K128-PWMA-触发ADC.rar (53.99 KB, 下载次数: 41)


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-08-20 11:17:19

4

主题

13

回帖

62

积分

注册会员

积分
62
发表于 4 天前 | 显示全部楼层
梁*** 发表于 2025-4-16 13:34
我写有STC32G系列的用PWM触发ADC,ADC中断读取结果。AI8H8K64U的PWM是一样的,您可以参考STC32G的,PWM4用 ...

梁工,请问你的思路是不是这样的?麻烦有时间帮忙指导一下。

PWM的周期一定的情况下,PWM1、2、3用于输出三路互补对称的PWM信号。那么PWM4可以通过改变占空比来触发任意时刻的ADC采样。

PWM的频率/周期是用PWMA_ARR寄存器设置,PWMA_CCR寄存器修改的是占空比,修改占空比就是修改任意触发时刻。

PWMA_CR2   |= (7<<4);设置将PWM4的TRGO信号用于触发ADC采样。
PWMA_CCMR4  = 0x78;设置PWM4的TRGO信号触发逻辑。当计数器大于设定PWMA_CCR4值的时候,触发高电平输出,否则输出低电平。ADC采样触发需要TRGO信号为高电平吧?

那对于三相互补对称的PWM输出,因为占空比是实时变化的,那我们是不是要根据PWM1、2、3的比较器的值来决定PWM4的触发时刻?像正弦波调制,比较器的值可以从0-1000之间变化,对应不同的正弦波幅值。如果需要逐周期保护,在每次PWM比较器值更换的时刻,都需要重装PWM4的比较器值,而如果按照中间时刻采样的方法来计算,PWM4的比较器值选择为PWM1比较器值的一半。在重装PWM1、2、3的中断函数PWMA_ISR函数中,同步重装PWM4的比较器值。

对于单相逆变,三相逆变等正弦波调制的场合,我的思路正确吗?还有没有提升的点?
PWM计数模式,像三相逆变场合,边沿对齐、中心对齐有什么区别吗?
谢谢了!

点评

是的,PWM4用于任意时刻触发ADC,不输出PWM。  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-08-23 11:06:14

76

主题

6636

回帖

1万

积分

超级版主

积分
13863
发表于 4 天前 | 显示全部楼层
水水水*** 发表于 2025-8-20 11:17
梁工,请问你的思路是不是这样的?麻烦有时间帮忙指导一下。

PWM的周期一定的情况下,PWM1、2、3用于输出 ...

是的,PWM4用于任意时刻触发ADC,不输出PWM。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-08-20 11:17:19

4

主题

13

回帖

62

积分

注册会员

积分
62
发表于 4 天前 | 显示全部楼层
梁*** 发表于 2025-8-20 13:19
是的,PWM4用于任意时刻触发ADC,不输出PWM。

那PWM4的PWMA_CCR4比较器的值该怎么设置呢?
1.选择PWM周期数的一半。例如PWM周期是10us,选择5us的周期数。
2.选择PWM1的CCR1值的一半。例如CCR1值是600,则选择300。
上面两种方案哪个好?如果选择整个PWM的周期,那PWM4比较器的值只要更新一次。如果选择根据PWM1的CCR1的值同步更新PWM4的比较器值,那就需要在ISR中断中同步更新。
还有就是边沿对齐模式,中央对齐模式,这个对于三相逆变这种功能来说,有什么区别吗?好像中央对齐模式用来触发ADC采样会更好?

点评

按需要设置,你想在一个周期的哪个时刻启动ADC,就设置为哪个时刻。  详情 回复 发表于 4 天前
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-08-23 11:06:14

76

主题

6636

回帖

1万

积分

超级版主

积分
13863
发表于 4 天前 | 显示全部楼层
水水水*** 发表于 2025-8-20 13:52
那PWM4的PWMA_CCR4比较器的值该怎么设置呢?
1.选择PWM周期数的一半。例如PWM周期是10us,选择5us的周期 ...

按需要设置,你想在一个周期的哪个时刻启动ADC,就设置为哪个时刻。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 02:13 , Processed in 0.121762 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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