找回密码
 立即注册
查看: 523|回复: 4

STC32F单片机ADC采集时钟问题

[复制链接]

4

主题

4

回帖

44

积分

新手上路

积分
44
发表于 2024-8-4 12:16:03 | 显示全部楼层 |阅读模式
使用STC32F12K54单片机对线阵CCD128个点进行ADC采样,系统时钟52M,ADC时钟2分频,实测对128个点采样需耗费400~500us左右,所以实际的采样频率只有250K,很难满足实时性要求,请问有什么比较好的解决办法吗
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16649
发表于 2024-8-4 12:18:23 | 显示全部楼层
用最新的 STC8051U, 工作在 42MHz, 实际比 STC32F快
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 2024-8-4 19:35:06 | 显示全部楼层
本帖最后由 梁工 于 2024-8-4 19:37 编辑

你的接口时序是怎么样的?贴一下看。
ADC采样最高可以达到500KHz,可以参考我的示波器例程。
采样128点256us可以完成。
回复 支持 反对

使用道具 举报 送花

4

主题

4

回帖

44

积分

新手上路

积分
44
发表于 2024-8-5 09:53:13 | 显示全部楼层
梁*** 发表于 2024-8-4 19:35
你的接口时序是怎么样的?贴一下看。
ADC采样最高可以达到500KHz,可以参考我的示波器例程。
采样128点256u ...

这个是ADC初始化
void adc_init(ADCN_enum adcn,ADC_SPEED_enum speed)
{
        ADC_CONTR |= 1<<7;                                //1 :打开 ADC 电源
       
        ADC_CONTR &= (0xF0);                        //清除ADC_CHS[3:0] : ADC 模拟通道选择位
        ADC_CONTR |= adcn;
       
        if((adcn >> 3) == 1) //P0.0
        {
                //IO口需要设置为高阻输入
                P0M0 &= ~(1 << (adcn & 0x07));
                P0M1 |= (1 << (adcn & 0x07));
        }
        else if((adcn >> 3) == 0) //P1.0       
        {
                //IO口需要设置为高阻输入
                P1M0 &= ~(1 << (adcn & 0x07));
            P1M1 |= (1 << (adcn & 0x07));
        }

        ADCCFG |= speed&0x0F;                        //ADC时钟频率SYSclk/2/speed&0x0F;
       
        ADCCFG |= 1<<5;                                        //转换结果右对齐。 ADC_RES 保存结果的高 2 位, ADC_RESL 保存结果的低 8 位。
}

这个是获取一次ADC值
uint16 adc_once(ADCN_enum adcn,ADCRES_enum resolution)
{
        uint16 adc_value;
       
        ADC_CONTR &= (0xF0);                        //清除ADC_CHS[3:0] : ADC 模拟通道选择位
        ADC_CONTR |= adcn;
       
        ADC_CONTR |= 0x40;                          // 启动 AD 转换
        while (!(ADC_CONTR & 0x20));          // 查询 ADC 完成标志
        ADC_CONTR &= ~0x20;                          // 清完成标志
       
        adc_value = ADC_RES;                          //存储 ADC 的 12 位结果的高 4 位
        adc_value <<= 8;
        adc_value |= ADC_RESL;                  //存储 ADC 的 12 位结果的低 8 位
       
        ADC_RES = 0;
        ADC_RESL = 0;
       
        adc_value >>= resolution;                //取多少位
       

        return adc_value;
}

点评

你的ADC速度设置是多少?采样时间多少?主频多少?做一次ADC的时间多少? 这几个关键参数一个都没有,我是不能猜测的。  详情 回复 发表于 2024-8-5 17:03
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 2024-8-5 17:03:14 | 显示全部楼层
ab*** 发表于 2024-8-5 09:53
这个是ADC初始化
void adc_init(ADCN_enum adcn,ADC_SPEED_enum speed)
{

你的ADC速度设置是多少?采样时间多少?主频多少?做一次ADC的时间多少?
这几个关键参数一个都没有,我是不能猜测的。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 21:48 , Processed in 0.130832 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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