2019-03-24 20:25发布
dcexpert 发表于 2015-4-2 14:11 参考函数,这个是SAM R21的,其他型号应该也差不多吧:
ljj3166 发表于 2015-4-2 14:35 有木有这么诡异?
littleshrimp 发表于 2015-4-2 14:39 你的代码测试了很好用。 我在调试的时候发现在下一次执行adc_init()时提示错误信息 /* Module must be disabled before initialization. Abort. */ 你的代码在采集完数据后把ADC关闭了正好解决这个问题,非常感谢。 像这种每采集一个通道就要初始化,使能,再禁能,这样做效率会不会很低?有其它办法可以实现再高效的数据采集吗?比如MSP430的ADC序列功能?
最多设置5个标签!
http://bbs.eeworld.com.cn/thread-457318-1-1.html
参考函数,这个是SAM R21的,其他型号应该也差不多吧:
- uint16_t ADC_get(uint8_t chn)
- {
- struct adc_config config_adc;
- struct adc_module adc_instance;
- volatile uint16_t result;
- adc_get_config_defaults(&config_adc);
- config_adc.positive_input = chn;
- config_adc.reference = ADC_REFERENCE_INTVCC1;
- config_adc.gain_factor = ADC_INPUTCTRL_GAIN_DIV2;
- config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV256;
- config_adc.accumulate_samples = ADC_AVGCTRL_SAMPLENUM_8;
- adc_init(&adc_instance, ADC, &config_adc);
- adc_enable(&adc_instance);
- adc_start_conversion(&adc_instance);
- do {
- } while (adc_read(&adc_instance, &result) == STATUS_BUSY);
- adc_disable(&adc_instance);
- return result;
- }
复制代码你的代码测试了很好用。
我在调试的时候发现在下一次执行adc_init()时提示错误信息 /* Module must be disabled before initialization. Abort. */
你的代码在采集完数据后把ADC关闭了正好解决这个问题,非常感谢。
像这种每采集一个通道就要初始化,使能,再禁能,这样做效率会不会很低?有其它办法可以实现再高效的数据采集吗?比如MSP430的ADC序列功能?
下一次初始化时没有关闭ADC,所以报错。
每次都重新初始化,效率肯定不高。但是如果要求不太高,这样也够用了,MCU速度是足够快的。如果需要高速ADC,这样应该是不行。这个是使用了查询方式等待ADC转换,使用中断方式可能会稍好一点。高速采样通常会使用DMA方式。
ASF这个架构虽然使用方便,不用关心太多底层细节,但是也限制了很多东西。ATMEL现在好像还不支持ADC多通道扫描方式(也可能是我没有看到,至少ASF中没有这个选项)。但是它支持多次采样以及过采样提高转换精度,这个功能在其他MCU中很少见到。
一周热门 更多>