qoeljdzs 发表于 2025-12-4 10:03:22

STC8H如何使用PWM周期重复触发ADC,库函数版本

库函数版本不知道如何配置才能实现此功能,就像如何使能TRGO

王昱顺 发表于 2025-12-4 10:31:49

没有这部分功能,直接使用寄存器操作吧

例如配置完PWM后,可以在PWM一个周期开始的时候触发ADC,使用PWMA_CR2 = 0x40;//更新事件触发TRGO,触发ADC转换,需要提前设置好ADC

qoeljdzs 发表于 2025-12-4 11:28:14

王昱顺 发表于 2025-12-4 10:31
没有这部分功能,直接使用寄存器操作吧

例如配置完PWM后,可以在PWM一个周期开始的时候触发ADC,使用PWMA_ ...

C:\Users\86175\Desktop\11.png看着是找到了

qoeljdzs 发表于 2025-12-17 09:53:18

        P1M0 = 0x00;
        P1M1 = 0x02;
        P3M0 = 0x00;
        P3M1 = 0x00;
       
        ADC_CONTR = ADC_POWER|ADC_EPWMT|1;
        delay_ms(10);
        EADC = 1;
       
//        PWMA_CR2 = 0x20;
//        PWMA_ARR = 3450;
//        PWMA_IER = 0x01;
//        PWMA_CR1 = 0x01;
       
        PWMA_CCER1 = 0x00;                        // 写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMA_CCMR1 = 0x70;                        // 设置CC1为PWM输出模式2
        PWMA_CCER1 = 0x01;                        // PWM1P配置通道输出使能和极性
        PWMA_CCMR1 |= 0x0C;                         // 开启PWMA_CCR1寄存器的预装载功能,输出比较快速使能
        PWMA_ARR = 5000;
        PWMA_CCR1 = 240;                            // 设置占空比时间
        PWMA_ENO = 0x01;                            // 使能PWM1P
        PWMA_BRK = 0x80;                            // 使能主输出

        PWMA_PS = 0x00;//高级 PWM 通道输出脚选择位

        EADC = 1;
        PWMA_CR2 = 0x20; //CEN 信号为 TRGO,可用于触发 ADC. 设置 0x10:单次触发;0x20:周期触发
        PWMA_ARR = 500;
        PWMA_IER = 0x40;
        PWMA_CR1 = 0x01; //设置 CEN 启动 PWMA 定时器,实时触发 ADC
       
        UART_config();
        Timer_config();
        EA = 1;                                                                                                      
==================================================
目前参照规格书写的,能输出PWM,也能触发ADC采样,但是输出的PWM波形会跳动,低电平时电平也低不下去,用官方例程的高级PWM例程输出的波形是正常的

梁工 发表于 2025-12-19 23:51:14

qoeljdzs 发表于 2025-12-17 09:53
P1M0 = 0x00;
      P1M1 = 0x02;
      P3M0 = 0x00;
本例程会在PWM1P的下降沿自动触发一次ADC转换。
MCU型号:STC8H2K12U SOP8
主频:24MHz
PWM输出端:P1.0(P3.2)--PWM1P,PWM频率6.8KHz,下降沿触发ADC转换。
ADC输入端: P3.3(ADC11),ADC中断取反P5.4输出指示ADC读取操作。




本例程使用PWM2P输出PWM,PWM1用于触发一次ADC转换,可以随意设定触发时间,本例设置为输出高电平中间触发ADC。
MCU型号:STC8H2K12U SOP8
主频:24MHz
PWM输出端:P1.2(P5.4)--PWM2P,PWM频率6.8KHz。
PWM1触发ADC:触发时刻为PWM2P高电平的中间。
ADC输入端: P3.3(ADC11),ADC中断取反P3.2输出指示ADC读取操作。






armfans 发表于 2026-4-12 04:15:47

为什么我按照第二个示例去设置,并没有在pwm2高电平的中间位置触发ADC,感觉下面这个设置是不是有问题,还是采用模式3比较脉冲的方式,而并不是pwm1来触发ADC,
PWMA_CR2   |= (3<<4);        // 触发ADC信号选择(TRG0), 1:计数器使能信号,2:更新事件, 3:比较脉冲, 4:比较OC1REF, 5:比较OC2REF, 6:比较OC3REF, 7:比较OC4REF.

我修改了这行代码,改为(4<<4)比较OC1REF, 可以在PWMA_CCR1设置的位置上触发ADC,但是又在pwm1的上升沿重复触发了一次,也就是在重载更新后又触发了一次。相当于每个pwm周期会触发2次ADC。
页: [1]
查看完整版本: STC8H如何使用PWM周期重复触发ADC,库函数版本