找回密码
 立即注册
查看: 216|回复: 8

ADC中断

[复制链接]
已绑定手机

11

主题

17

回帖

141

积分

注册会员

积分
141
发表于 2026-7-29 17:10:47 | 显示全部楼层 |阅读模式
芯片:stc8h4k64tlcd
目的:使用ADC其中一个通道 采集s13131-1536传感器VIDEO信号, 根据触发信号(trig上升沿)采集信号,s13131-1536传感器CLK(50K-2M);
          另外还要一个通道读取电池电量;
          采集VIDEO信号需要一定速度,读取电池电量不需要太快;

问题:ADC转换完进入中断然后获取数据,这一系列操作需要在下次trig上升沿信号前完成否则会有触发丢失    传感器CLK和ADC速度怎么配置才不会造成触发丢失,然后在不读取传感器数据时怎么切换到另一个通道读取电池电量
回复

使用道具 举报 送花

83

主题

8216

回帖

1万

积分

超级版主

积分
17634
发表于 2026-7-29 18:07:45 | 显示全部楼层
两个trig上升沿的时间间隔最短是多少?
回复

使用道具 举报 送花

已绑定手机

11

主题

17

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2026-7-29 18:28:12 | 显示全部楼层
梁*** 发表于 2026-7-29 18:07
两个trig上升沿的时间间隔最短是多少?

每个间隔时间都是1个时钟周期

点评

我要的是具体时间值,否则我没有办法判断是否能实现。 ADC转换时间最快最好不超过2us,10us以上会更从容。  详情 回复 发表于 2026-7-29 20:28
回复

使用道具 举报 送花

9

主题

750

回帖

5179

积分

论坛元老

积分
5179
发表于 2026-7-29 18:29:03 | 显示全部楼层
s13131-1536是CMOS线阵传感器,时钟范围50khz-2Mhz,触发信号跟时钟一样,
STC单片机的ADC速度最高800khz,所以选取s13131-1536时钟频率要低于ADC的最高采样频率.选定采样频率后用ISP软件里的ADC计算器来得到配置参数.
高速采样时要注意信号源驱动能力和阻抗匹配,以免造成过大采样误差.
回复

使用道具 举报 送花

83

主题

8216

回帖

1万

积分

超级版主

积分
17634
发表于 2026-7-29 20:28:29 | 显示全部楼层
mppq*** 发表于 2026-7-29 18:28
每个间隔时间都是1个时钟周期

我要的是具体时间值,否则我没有办法判断是否能实现。
ADC转换时间最快最好不超过2us,10us以上会更从容。
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25104
发表于 2026-7-29 20:31:42 | 显示全部楼层
截图202607292031291278.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25104
发表于 2026-7-29 20:32:18 | 显示全部楼层

好的,我已经看到了这个帖子。下面我以 STC FAE 工程师的身份,针对楼主的问题给出专业分析和建议。


问题分析

芯片型号:STC8H4K64TLCD​传感器:s13131-1536 CMOS线阵传感器​需求

  1. 用 ADC 采集 VIDEO 信号,由 TRIG 上升沿触发
  2. 另用一个通道读取电池电量(低速)
  3. 每次 ADC 转换 + 中断读取必须在下一个 TRIG 上升沿之前完成,否则丢触发

关键参数评估

1. 传感器时钟与触发信号

楼主说"每个间隔时间都是1个时钟周期",但传感器 CLK 范围是 50kHz ~ 2MHz,对应的周期为:

CLK 频率 周期
50 kHz 20 μs
500 kHz 2 μs
1 MHz 1 μs
2 MHz 0.5 μs

如果 CLK = 2MHz,TRIG 间隔仅 0.5μs,这是不可能用 ADC 中断完成的。 所以必须明确:您实际使用的传感器 CLK 频率是多少? 这是决定方案可行性的核心前提。

2. STC8H4K64TLCD 的 ADC 速度

根据 STC8H 系列手册("ADC模数转换"章节),ADC 转换时间公式为:

ADC 转换时间 = (ADC_TIM + 1) × 12 个时钟周期
其中 ADC_TIM 为 ADC 时序控制寄存器中的转换速度设置位,取值范围 0~63。

主频 40MHz 为例:

ADC_TIM 设置 转换时间
0(最快) 1 × 12 / 40MHz =0.3 μs
1 2 × 12 / 40MHz =0.6 μs
2 3 × 12 / 40MHz =0.9 μs
3 4 × 12 / 40MHz =1.2 μs
15 16 × 12 / 40MHz =4.8 μs

最快可到 0.3μs(约 3.33Msps),但实际建议留有余量,一般设置 ADC_TIM=13,转换时间 0.61.2μs。

3. 中断响应时间

ADC 转换完成后进入中断,执行中断服务程序(读取 ADC 结果、清标志、切换通道等),加上中断响应延迟(约 710 个系统时钟),**总耗时大约再加 0.20.5μs**。


方案建议

方案一:如果 CLK ≤ 500kHz(周期 ≥ 2μs)—— 可行

ADC 设置为最快模式(ADC_TIM=0~1),中断内完成读取和通道切换,时间充裕。

配置示例代码:

// 主频 40MHz,ADC 时钟 = 40MHz/2/12 ≈ 1.67MHz
// ADC_TIM = 1,转换时间 ≈ 0.6μs

P_SW2 |= 0x80;          // 使能访问 XFR

// ADC 配置
ADCCFG = 0x20;          // 右对齐,ADC 时钟 = SYSCLK/2/12
ADCTIM = 0x00;          // ADC_TIM = 0,最快转换

// 使能 ADC 中断
ADC_CONTR = 0x80;       // 开启 ADC 电源
ADC_CONTR |= 0x40;      // 开启 ADC 中断
EA = 1;                 // 开启总中断

// 启动第一次转换(假设通道 0 为 VIDEO 信号)
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x00;  // 选择通道 0
ADC_CONTR |= 0x40;      // 启动转换

中断服务程序:

void ADC_Isr() interrupt 13
{
    unsigned int adc_val;
    unsigned char ch;
  
    adc_val = (ADC_RES << 8) | ADC_RESL;    // 读取 ADC 结果
  
    ch = ADC_CONTR & 0x0F;                  // 当前通道号
  
    if(ch == 0)  // VIDEO 通道
    {
        // 处理 VIDEO 数据
        video_buffer[video_index++] = adc_val;
      
        // 切换到电池电量通道(通道 1)
        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x01;
    }
    else if(ch == 1)  // 电池电量通道
    {
        // 处理电池电量数据
        battery_value = adc_val;
      
        // 切换回 VIDEO 通道(通道 0)
        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x00;
    }
  
    // 清除中断标志并启动下一次转换
    ADC_CONTR &= ~0x20;     // 清 ADC_FLAG
    ADC_CONTR |= 0x40;      // 启动下一次转换
}

方案二:如果 CLK ≥ 1MHz(周期 ≤ 1μs)—— 需要优化

此时中断方式可能来不及,建议改用 DMA + ADC 自动扫描 方式:

  • 使用 STC8H 的 ADC 自动扫描模式(ADC_CONTR 中的 ADC_SS[1:0] 位),配置多个通道自动轮询
  • 配合 DMA 将 ADC 结果自动搬运到内存缓冲区,无需中断干预
  • 主循环中查询 DMA 完成标志即可

方案三:如果 CLK = 2MHz(周期 0.5μs)—— 不可行

ADC 最快 0.3μs 转换 + 中断响应,无法在 0.5μs 内完成一次完整采集。此时需要:

  • 降低传感器 CLK 频率(建议 ≤ 500kHz)
  • 或改用外部高速 ADC + FPGA 方案

关于通道切换策略

您提到"不读取传感器数据时切换到另一个通道读取电池电量",建议:

  1. VIDEO 采集期间:ADC 固定通道 0,每次 TRIG 触发采集
  2. VIDEO 空闲期间:切换到通道 1 读取电池电量(低速,无需中断,轮询即可)
  3. 切换方法:在 ADC 中断中判断当前通道,VIDEO 通道采集完成后立即切回,电池电量通道采集完成后也立即切回,保证 VIDEO 通道始终处于"待命"状态

需要您确认的信息

为了给出更精确的方案,请您补充:

  1. 传感器实际使用的 CLK 频率是多少?(50kHz ~ 2MHz 范围太宽)
  2. TRIG 信号与 CLK 的关系:是每个 CLK 周期都有一个 TRIG 上升沿,还是每 N 个 CLK 才有一个 TRIG?
  3. 主频设置:您计划使用多大的系统时钟频率?
  4. VIDEO 信号是否需要连续采集,还是只在特定时间段采集?

请提供这些信息,我可以给出更精确的配置参数和代码。


🔍 搜索 "https://www.stcaimcu.com/thread-25043-1-1.html"

⏱️ 查找用时 3.6s | 总回答用时 22.2s

回复

使用道具 举报 送花

已绑定手机

11

主题

17

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2026-7-30 10:23:42 | 显示全部楼层
梁*** 发表于 2026-7-29 20:28
我要的是具体时间值,否则我没有办法判断是否能实现。
ADC转换时间最快最好不超过2us,10us以上会更从容 ...

将传感器CLK设为100K的话    每个间隔时间就是10us

点评

CLK设为100K可以的,ADC的时间要配置好,保证在6us内完成ADC,留点时间进终端读取结果。  详情 回复 发表于 2026-7-30 12:29
回复

使用道具 举报 送花

83

主题

8216

回帖

1万

积分

超级版主

积分
17634
发表于 2026-7-30 12:29:57 | 显示全部楼层
mppq*** 发表于 2026-7-30 10:23
将传感器CLK设为100K的话    每个间隔时间就是10us

CLK设为100K可以的,ADC的时间要配置好,保证在6us内完成ADC,留点时间进终端读取结果。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-22 11:32 , Processed in 0.078384 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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