STC32F单片机ADC采集时钟问题
使用STC32F12K54单片机对线阵CCD128个点进行ADC采样,系统时钟52M,ADC时钟2分频,实测对128个点采样需耗费400~500us左右,所以实际的采样频率只有250K,很难满足实时性要求,请问有什么比较好的解决办法吗用最新的 STC8051U, 工作在 42MHz, 实际比 STC32F快 本帖最后由 梁工 于 2024-8-4 19:37 编辑
你的接口时序是怎么样的?贴一下看。
ADC采样最高可以达到500KHz,可以参考我的示波器例程。
采样128点256us可以完成。
梁工 发表于 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;
} abo_ 发表于 2024-8-5 09:53
这个是ADC初始化
void adc_init(ADCN_enum adcn,ADC_SPEED_enum speed)
{
你的ADC速度设置是多少?采样时间多少?主频多少?做一次ADC的时间多少?
这几个关键参数一个都没有,我是不能猜测的。
页:
[1]