idmdpzxw 发表于 2025-4-16 11:02:43

AI8H8K64U

请教一下 我现在输出 1-3PPWM输出 采样中间对齐的模式 怎么实现在 高电平的中间开启ADC采样 或者DMA采样得到数据下面是配置文件 采用中央对齐模式二还要一个问题就是当进入ADC中断 采用一个通道的数据后 在开启DMA,然后进入中断采完数据的时间很长

国芯人工智能 发表于 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。

c
PWMInitTypeDef PWMInitStructure;
PWMInitStructure.PWMMode = PWMModeCenterAligned2;
PWMInitStructure.PWMPeriod = PWMPERIOD;
PWMInitStructure.PWMDuty = PWMDUTY;
PWMInit(&PWMInitStructure);

2.2 配置ADC模块
接下来,配置ADC模块,使其在PWM计数器达到特定值时触发采样。这个特定值应该是PWM周期的一半,即PWMPERIOD / 2,这样采样点就会位于高电平的中间位置。

c
ADCInitTypeDef ADCInitStructure;
ADCInitStructure.ADCMode = ADCModeSingle;
ADCInitStructure.ADCTriggerSource = ADCTriggerSourcePWM;
ADCInitStructure.ADCTriggerValue = PWMPERIOD / 2;
ADCInit(&ADCInitStructure);

2.3 配置DMA模块
如果需要使用DMA来传输ADC采样数据,可以配置DMA模块,使其在ADC采样完成后自动将数据传输到指定的内存地址。

c
DMAInitTypeDef DMAInitStructure;
DMAInitStructure.DMAMode = DMAModeCircular;
DMAInitStructure.DMAPeripheralBaseAddr = (uint32t)&ADC1->DR;
DMAInitStructure.DMAMemoryBaseAddr = (uint32t)ADCDataBuffer;
DMAInitStructure.DMABufferSize = ADCBUFFERSIZE;
DMAInit(&DMAInitStructure);

3. 中断处理
在ADC采样完成后,可以通过中断来处理采样数据。如果需要在中断中开启DMA,可以在ADC中断服务程序中启动DMA传输。

c
void ADCIRQHandler(void) {
    if (ADCGetITStatus(ADCITEOC) != RESET) {
      // 读取ADC采样数据
      uint16t adcvalue = ADCGetConversionValue(ADC1);
      
      // 启动DMA传输
      DMACmd(DMA1Channel1, ENABLE);
      
      // 清除中断标志
      ADCClearITPendingBit(ADCITEOC);
    }
}

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采样触发值等参数,以达到最佳的采样效果。

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

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

idmdpzxw 发表于 2025-4-16 11:04:22

我现在是 在高电平跟低电平都会进去一次

梁工 发表于 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.





水水水木木木 发表于 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计数模式,像三相逆变场合,边沿对齐、中心对齐有什么区别吗?
谢谢了!

梁工 发表于 4 天前

水水水木木木 发表于 2025-8-20 11:17
梁工,请问你的思路是不是这样的?麻烦有时间帮忙指导一下。

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

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

水水水木木木 发表于 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采样会更好?

梁工 发表于 4 天前

水水水木木木 发表于 2025-8-20 13:52
那PWM4的PWMA_CCR4比较器的值该怎么设置呢?
1.选择PWM周期数的一半。例如PWM周期是10us,选择5us的周期 ...

按需要设置,你想在一个周期的哪个时刻启动ADC,就设置为哪个时刻。
页: [1]
查看完整版本: AI8H8K64U