找回密码
 立即注册
查看: 345|回复: 5

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-17 09:53:18
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-12-4 10:03:22 | 显示全部楼层 |阅读模式
库函数版本不知道如何配置才能实现此功能,就像如何使能TRGO
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:710
  • 最近打卡:2026-04-29 17:46:54
已绑定手机
已实名认证

131

主题

3416

回帖

8928

积分

版主

积分
8928
发表于 2025-12-4 10:31:49 | 显示全部楼层
没有这部分功能,直接使用寄存器操作吧
截图202512041030147660.jpg
例如配置完PWM后,可以在PWM一个周期开始的时候触发ADC,使用PWMA_CR2 = 0x40;//更新事件触发TRGO,触发ADC转换,需要提前设置好ADC
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-17 09:53:18
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-12-4 11:28:14 | 显示全部楼层
王*** 发表于 2025-12-4 10:31
没有这部分功能,直接使用寄存器操作吧

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-17 09:53:18
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 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例程输出的波形是正常的

点评

本例程会在PWM1P的下降沿自动触发一次ADC转换。 MCU型号:STC8H2K12U SOP8 主频:24MHz PWM输出端:P1.0(P3.2)--PWM1P,PWM频率6.8KHz,下降沿触发ADC转换。 ADC输入端: P3.3(ADC11),ADC中断取反P5.4输出指示ADC  详情 回复 发表于 2025-12-19 23:51
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:334
  • 最近打卡:2026-04-28 11:53:20

85

主题

7349

回帖

1万

积分

超级版主

积分
15865
发表于 2025-12-19 23:51:14 | 显示全部楼层
qoel*** 发表于 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读取操作。

示波器波形-PWM1P输出-下降沿触发ADC.PNG


本例程使用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读取操作。

示波器波形-PWM2P输出-PWM1触发ADC.PNG


09D-STC8H2K08U系列-PWMA-触发ADC.rar (1.49 MB, 下载次数: 12)

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-04-12 04:15:47

5

主题

10

回帖

85

积分

注册会员

积分
85
发表于 2026-4-12 04:15:47 | 显示全部楼层
为什么我按照第二个示例去设置,并没有在pwm2高电平的中间位置触发ADC,感觉下面这个设置是不是有问题,还是采用模式3比较脉冲的方式,而并不是pwm1来触发ADC,
  1. 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。
回复

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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