STC8H如何使用PWM周期重复触发ADC,库函数版本
库函数版本不知道如何配置才能实现此功能,就像如何使能TRGO没有这部分功能,直接使用寄存器操作吧
例如配置完PWM后,可以在PWM一个周期开始的时候触发ADC,使用PWMA_CR2 = 0x40;//更新事件触发TRGO,触发ADC转换,需要提前设置好ADC
王昱顺 发表于 2025-12-4 10:31
没有这部分功能,直接使用寄存器操作吧
例如配置完PWM后,可以在PWM一个周期开始的时候触发ADC,使用PWMA_ ...
C:\Users\86175\Desktop\11.png看着是找到了
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例程输出的波形是正常的 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读取操作。
为什么我按照第二个示例去设置,并没有在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]