abo_ 发表于 2024-8-4 12:16:03

STC32F单片机ADC采集时钟问题

使用STC32F12K54单片机对线阵CCD128个点进行ADC采样,系统时钟52M,ADC时钟2分频,实测对128个点采样需耗费400~500us左右,所以实际的采样频率只有250K,很难满足实时性要求,请问有什么比较好的解决办法吗

神农鼎 发表于 2024-8-4 12:18:23

用最新的 STC8051U, 工作在 42MHz, 实际比 STC32F快

梁工 发表于 2024-8-4 19:35:06

本帖最后由 梁工 于 2024-8-4 19:37 编辑

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

abo_ 发表于 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 : 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 : 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;
}

梁工 发表于 2024-8-5 17:03:14

abo_ 发表于 2024-8-5 09:53
这个是ADC初始化
void adc_init(ADCN_enum adcn,ADC_SPEED_enum speed)
{


你的ADC速度设置是多少?采样时间多少?主频多少?做一次ADC的时间多少?
这几个关键参数一个都没有,我是不能猜测的。
页: [1]
查看完整版本: STC32F单片机ADC采集时钟问题