完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
由于ADC没有文档介绍也没有历程所以就只能靠着他所给的API来用,对照着PWM一步一步的来,最后还是调通了。也总结了不少技巧,比如他所提供的API前面有static的就是他文件内部是函数,给自己调用的,到最后就剩下了几个。比如初始化的,adc通道配置的,adc开始停止的,adc模式的函数,还有给DMA用的缓冲区还有他相应的配置函数等等。 · ☐ 1.内部盗用的API,可以不用管他,刚开始还研究了好久。 ☐ static void wj_adc_channel_conv_end_irq(csi_adc_t *adc) ☐ static void wj_adc_irqhandler(void *args) ☐ static csi_error_t wj_adc_start_intr(csi_adc_t *adc) ☐ static csi_error_t wj_adc_start_dma(csi_adc_t *adc) ☐ static csi_error_t wj_adc_stop_intr(csi_adc_t *adc) ☐ static csi_error_t wj_adc_stop_dma(csi_adc_t *adc) ☐ static int adc_channel_delete(uint8_t *channels, uint8_t nums, uint8_t channel) ☐ ☐ 2.ADC初始化,开始停止,通道配置,采样频率、时间,回调函数,ADC读取值等等 ☐ csi_error_t csi_adc_init(csi_adc_t *adc, uint32_t idx) ☐ void csi_adc_uninit(csi_adc_t *adc) ☐ csi_error_t csi_adc_start(csi_adc_t *adc) ☐ csi_error_t csi_adc_stop(csi_adc_t *adc) ☐ csi_error_t csi_adc_channel_enable(csi_adc_t *adc, uint8_t ch_id, bool is_enable) ☐ csi_error_t csi_adc_channel_sampling_time(csi_adc_t *adc, uint8_t ch_id, uint16_t clock_num) ☐ csi_error_t csi_adc_sampling_time(csi_adc_t *adc, uint16_t clock_num) ☐ uint32_t csi_adc_freq_div(csi_adc_t *adc, uint32_t div) ☐ int32_t csi_adc_read(csi_adc_t *adc) ☐ csi_error_t csi_adc_get_state(csi_adc_t *adc, csi_state_t *state) ☐ uint32_t csi_adc_get_freq(csi_adc_t *adc) ☐ csi_error_t csi_adc_attach_callback(csi_adc_t *adc, void *callback, void *arg) ☐ void csi_adc_detach_callback(csi_adc_t *adc) ☐ csi_error_t csi_adc_start_async(csi_adc_t *adc) ☐ csi_error_t csi_adc_stop_async(csi_adc_t *adc) ☐ csi_error_t csi_adc_continue_mode(csi_adc_t *adc, bool is_enable) ☐ ☐ 3.ADC DMA相关配置函数: ☐ void wj_adc_dma_event_cb(csi_dma_ch_t *dma, csi_dma_event_t event, void *arg) ☐ csi_error_t csi_adc_set_buffer(csi_adc_t *adc, uint32_t *data, uint32_t num) ☐ csi_error_t csi_adc_link_dma(csi_adc_t *adc, csi_dma_ch_t *dma) ☐ 一、对adc单通道采样: 先来说说用查询的方法对adc单通道采样的:
☐ { ☐ csi_pin_set_mux(EXAMPLE_ADC_CH0, PA3_ADC_A1); ☐ csi_adc_init(&adc1, 0); ☐ uint32_t freq_value = csi_adc_freq_div(&adc1, 128); ☐ printf("get freq_value: %dn", freq_value); ☐ csi_adc_sampling_time(&adc1, 2); ☐ csi_adc_continue_mode(&adc1, 1);//这句是连续采样,不使能只能采样一次 ☐ ☐ csi_adc_channel_enable(&adc1, 0, true); ☐ ☐ while(1) ☐ { ☐ lv_task_handler(); ☐ aos_msleep(400); ☐ lv_tick_inc(1); ☐ i = csi_adc_read(&adc1); ☐ printf("adc1:%d ", i); ☐ } ☐ } 二、对adc单通道采样: 那怎么用查询的方法对多通道采样呢?这个问题开始也是想了很久,因为读取adc函数就只有一个adc的句柄,这个句柄是初始化函数过来得到的,没有包含通道的相关操作,这我就联想到了atm32sac的几种模式,就是扫描模式,多通道读取完一个自动对下一个进行读取,然后我就按照这个 ☐ csi_adc_channel_enable(&adc1, 0, true); ☐ csi_adc_channel_enable(&adc1, 1, true); ☐ csi_adc_channel_enable(&adc1, 2, true); 注册了几个端口,连续读取三次果然是三个端口的值: ☐ i = csi_adc_read(&adc1); ☐ printf("adc1:%d ", i); ☐ i = csi_adc_read(&adc1); ☐ printf("adc1:%d ", i); ☐ i = csi_adc_read(&adc1); ☐ printf("adc1:%d ", i); 结果就是依次读取那个PA3-5的adc值。 三、DMA对多通道采样 实际上我们比较多用DMA采样多通道的adc值,这样可以释放cpu也可以很好的随时读取:
☐ csi_adc_link_dma( &adc1, &dma1); ☐ csi_adc_channel_enable(&adc1, 0, true); ☐ csi_adc_channel_enable(&adc1, 1, true); ☐ csi_adc_channel_enable(&adc1, 2, true); ☐ csi_adc_start_async(&adc1); ☐ while(1) ☐ { ☐ lv_task_handler(); ☐ aos_msleep(400); ☐ lv_tick_inc(1); ☐ ☐ i=buff0[0]; ☐ printf("adc1:%d ", i); ☐ printf("adc1:%d mvrn", i * 3300 / 4095); ☐ i=buff0[1]; ☐ printf("adc1:%d ", i); ☐ printf("adc1:%d mvrn", i * 3300 / 4095); ☐ i=buff0[2]; ☐ printf("adc1:%d ", i); ☐ printf("adc1:%d mvrn", i * 3300 / 4095); ☐ } 文章转载自:平头哥芯片开放社区 作者:溪悦哦 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
【平头哥Sipeed LicheeRV 86开发板试用体验】Waft初体验
15655 浏览 1 评论
13703 浏览 4 评论
【平头哥Sipeed LicheeRV 86开发板试用体验】四、烧写waft系统&搭建waft测试环境
19620 浏览 2 评论
59026 浏览 19 评论
【限时福利】加入芯片开发社区,领100G电子工程师资料大礼包
87687 浏览 121 评论
邀请函 | 3月2日 来上海参加平头哥“玄铁RISC-V生态大会”
742浏览 0评论
读书分享会 | 玄铁RISC-V处理器入门与实战电子书免费下载!
631浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:03 , Processed in 0.542029 second(s), Total 63, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号