0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【南京中科微CSM32RV20开发板试用体验】不带扫描的ADC,如何实现多个模拟通道采样?

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-11-30 10:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:xcs101, 帖子地址:https://bbs.elecfans.com/jishu_2252385_1_1.html

本次实验旨在利用ADC结合UART,完成试用计划中的项目,实现对电源模块的控制。
一、ADC外设介绍
CSM32RV20 内置了 1 个快速、高精度 ADC,内部集成高精度 1.2 V 基准源, 支持 13/14/15/16 位分辨率, 在分辨率和转换速度之间得到平衡。 ADC 工作时, VDD 电压要求大于 2.5 V。
注: 1) 推荐用户使用 ADC 时,将 ADC_CCR[5]写 1,否则会增大功耗;
2) 分辨率出厂初始化, 用户不可更改。
3)PGA通道对应模拟通道10,引脚PA12,相关参数在ADC寄存器中。
pYYBAGILvkOAErrNAAF4UuJc-ME075.png

二、ADC功能
  • 分辨率为13位,需29个ADC时钟周期完成一次转换
  • 分辨率为14位,需45个ADC时钟周期完成一次转换
  • 分辨率为15位,需77个ADC时钟周期完成一次转换
  • 分辨率为16位,需141个ADC时钟周期完成一次转换
  • ADC转换完成之后自动产生中断
  • ADC时钟与总线时钟具有相同的时钟源,支持1/2/4/8分频
  • ADC采样时钟推荐4MHz,最高不超过8MHz
  • 支持单次模式和连续模式
  • 连续模式下转换间隔可编程
  • 支持软件触发和GPIO触发
  • 可测量电压范围为0~VDD(VDD < 4.8 V)
  • 支持外部基准
  • 11个测量通道可选,最多支持9个触摸按键
  • 支持待测量电压乘以1/4

三、库函数介绍
ADC共有4个库函数


  1. //中断处理函数
  2. void ADC_IRQHandler(void) __attribute__((interrupt("SiFive-CLIC-preemptible")));
  3. //初始化函数
  4. void ADC_Init_case1(void);//内部基准,测量PA4输入电压
  5. //功能函数
  6. uint32_t ADC_Conversion(void);//适用于非中断模式
  7. void ADC_Soft_Start(void);//软件触发ADC,适用于中断模式
复制代码


  • 中断处理函数


    1. void ADC_IRQHandler(void)
    2. {
    3. if(ADC->ISR&0x04)//
    4. {
    5. ADC->CR &= ~0x02; //软件关闭ADC
    6. //adc_result = ADC->DR;
    7. //GPIO_Toggle(GPIOA,PIN9);
    8. }
    9. }
    复制代码

  • 初始化函数
    poYBAGILwi-ALok4AAS83STE5ik483.png

    pYYBAGILwOeAfWifAAIiZjg5Fgk062.png

    pYYBAGILwFGAf_aVAABiMgoykSc349.png



    1. void ADC_Init_case1(void)//内部基准,测量PA4输入电压
    2. {
    3. ADC->CCR = 0<<20 //CCR[21:20]----------测试控制:00-关闭,01-VREFP输出,10-VREFN输出,11-Vt温度传感器输出
    4. |1<<19 //CCR[19]---------内部通道增益:0-1,1-1/4
    5. |0<<16 //CCR[21:20]-----------PGA增益:000-1,001-2,010-4......111-128
    6. |1<<13 //CCR[15:13]------内部基准选择:0-(1.7~0.498V),1-(1.214~0V)
    7. |0<<12 //CCR[12]-------------基准来源:0-内部基准,1-外部基准
    8. |0<<8  //CCR[11:8]---------转换前延时:0000-不延时,0001-2^0个ADC时钟,0010-2^1个ADC时钟...1111-2^14个ADC时钟
    9. |3<<6  //CCR[7:6]------------时钟分频:00-不分频,01-2分频...11-8分频(时钟<=4M)
    10. |0<<5  //CCR[5]1/2VDD电压采集通道使能:0-关闭,1-使能
    11. |0<<4  //CCR[4]----------GPIO触发模式:0-上升沿触发,1-下降沿触发
    12. |0<<2  //CCR[7:6]----------触发信号源:00-软件触发,01/10-保留,11-GPIO触发
    13. |0<<1  //CCR[1]--------------采样模式:0-单次模式,1-连续模式
    14. |1<<0; //CCR[0]--------------电源开关:0-OFF,1-ON
    15. Delay32M_us(20);//ADC电源开启需要时间
    16. ADC->SEL = 3; //测量通道选择:0-PTAT,1-1/2VDD,2-PAD3,3-PAD4,4-PAD5,5-PAD6,6-PAD7,7-PAD8,8-PAD9,9-PAD10,10-NTC,11-VDD,其它-无
    17. ADC->IER |= 0<<2 //IER[2]--------中断使能:0-非中断模式,1-中断模式,默认为0;
    18. GPIO_MODE_Init(GPIOA,PIN4,GPIO_MODE_ANALOG);//设置GPIO为ADC输入
    19. }
    复制代码

  • 功能函数
    通过ADC_Conversion(void)函数可实现ADC软启动,并返回采样值,ADC最大分辨率为16位,数据存放在ADC_DR寄存器,采用小端对齐。
    pYYBAGILumKAIKI5AAG44OKwd6Y905.png



    1. uint32_t ADC_Conversion(void)//适用于非中断模式
    2. {
    3. uint32_t adc_result;
    4. //控制寄存器
    5. ADC->CR = 1; //1:开启转换,0:结束转换
    6. while(!(ADC->ISR&0x04));
    7. adc_result = ADC->DR;
    8. return adc_result;
    9. }
    复制代码


    库函数中软软件触发程序有误,应该将ADC_CR[0]置1启动,程序里写成将ADC_CR[1]置1启动。
    pYYBAGILoEeAH49TAAImDbcFle8560.png

    应修改如下:


    1. void ADC_Soft_Start(void)//软件触发ADC,适用于中断模式
    2. {
    3. ADC->CR |= 0x01;
    4. }
    复制代码


四、轮流读取各通道数据功能实现
  • 修改初始化函数如下:


    1. ADC_Init(uint32_t ch)
    2. {
    3. ADC->CCR = 0<<20 //CCR[21:20]----------测试控制:00-关闭,01-VREFP输出,10-VREFN输出,11-Vt温度传感器输出
    4. |1<<19 //CCR[19]---------内部通道增益:0-1,1-1/4
    5. |0<<16 //CCR[21:20]-----------PGA增益:000-1,001-2,010-4......111-128
    6. |1<<13 //CCR[15:13]------内部基准选择:0-(1.7~0.498V),1-(1.214~0V)
    7. |0<<12 //CCR[12]-------------基准来源:0-内部基准,1-外部基准
    8. |0<<8  //CCR[11:8]---------转换前延时:0000-不延时,0001-2^0个ADC时钟,0010-2^1个ADC时钟...1111-2^14个ADC时钟
    9. |3<<6  //CCR[7:6]------------时钟分频:00-不分频,01-2分频...11-8分频(时钟<=4M)
    10. |0<<5  //CCR[5]1/2VDD电压采集通道使能:0-关闭,1-使能
    11. |0<<4  //CCR[4]----------GPIO触发模式:0-上升沿触发,1-下降沿触发
    12. |0<<2  //CCR[7:6]----------触发信号源:00-软件触发,01/10-保留,11-GPIO触发
    13. |0<<1  //CCR[1]--------------采样模式:0-单次模式,1-连续模式
    14. |1<<0; //CCR[0]--------------电源开关:0-OFF,1-ON
    15. Delay32M_us(20);//ADC电源开启需要时间
    16. ADC->SEL = ch; //测量通道选择:0-PTAT,1-1/2VDD,2-PAD3,3-PAD4,4-PAD5,5-PAD6,6-PAD7,7-PAD8,8-PAD9,9-PAD10,10-NTC,11-VDD,其它-无
    17. if(ch>2&ch<9)
    18. {GPIO_MODE_Init(GPIOA,ch,GPIO_MODE_ANALOG)}//设置GPIO为ADC输入
    19. else if(ch=10)
    20. {GPIO_MODE_Init(GPIOA,PIN12,GPIO_MODE_ANALOG)}
    21. }
    复制代码

  • 实现多通道采样


    1. uint32_t ch_value[3];
    2. /*初始化通道1*/
    3. ADC_Init(1);
    4. /*获取通道1数据*/
    5. ch_value[0] = ADC_Conversion();
    6. Delay32M_us(20);
    7. /*初始化通道2*/
    8. ADC_Init(2);
    9. /*获取通道2数据*/
    10. ch_value[1] = ADC_Conversion();
    11. /*初始化通道3*/
    12. ADC_Init(3);
    13. /*获取通道3数据*/
    14. ch_value[2] = ADC_Conversion();
    15. /*通过串口1发送3个通道数据*/
    16. Uart_Send(UART1ch_value,3);
    复制代码

  • 实现比较控制
    /*当输入模拟量不在设置值中时,对应报警灯亮*/
    /*初始化设置值,数组前一位为上限,后一位为下限*/


    1. uint32_t SET1_value[2];
    2. uint32_t SET2_value[2];
    3. uint32_t SET3_value[2];
    4. SET1_value[0] = 5;
    5. SET1_value[1] =25;
    6. SET2_value[0] = 5;
    7. SET2_value[1] =25;
    8. SET3_value[0] = 5;
    9. SET3_value[1] =25;
    10. if(ch_value[0]>SET1_value[0] &ch_value[1][1]>
    11. GPIO_Write(GPIOA,PIN9,GPIO_RESET);
    12. else
    13. GPIO_Write(GPIOA,PIN9,GPIO_SET);
    14. if(ch_value[1]>SET2_value[0] &ch_value[1][1]>
    15. GPIO_Write(GPIOA,PIN11,GPIO_RESET);
    16. else
    17. GPIO_Write(GPIOA,PIN11,GPIO_SET);
    18. if(ch_value[2]>SET3_value[0] &ch_value[1][1]>
    19. GPIO_Write(GPIOA,PIN13,GPIO_RESET);
    20. else
    21. GPIO_Write(GPIOA,PIN13,GPIO_SET);
    复制代码


四、总结
到此,本次试用按计划完成开发板的学习试用,相关UART的接收发送程序参考之前的文章,比如设置值如何用串口更新,如何将采样值发送出去。
通过本次试用感受到国产芯片的进步。其外设使用的便利性,为我们开发缩短周期。但是芯片配套生态系统对比进口芯片明显不足,缺少初始化配置软件,用户手册编写比较简单,内容不够充实,排版不能较好结合开发人员的思路,另外官方提供的库函数存在较为明显的BUG。
希望有更多的网友一起在后续使用中共同探讨CSM32RV20,也希望厂商能尽快对接国际大厂的发展思路,对相关软件进行研发升级,对芯片的BUG进行改进。
最后感谢南京中科微和电子发烧友提供这个机会,以上仅代表个人现阶段想法,如有不妥,请及时指出,有任何建议,欢迎最下方留言区留言!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 南京中科微
    +关注

    关注

    0

    文章

    60

    浏览量

    1369
  • CSM32RV20
    +关注

    关注

    0

    文章

    40

    浏览量

    460
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【作品合集】中科昊芯Core_DSC280025C开发板测评

    试用体验】---LED闪烁灯 【中科昊芯Core_DSC280025C开发板试用体验】---定时器中断方式的LED流水灯 【中科昊芯Core
    发表于 09-18 10:52

    【作品合集】玄铁Banana Pi BPI-RV2开发板测评

    测试 作者:chen000000009【Banana Pi BPI-RV2开发板试用体验】开箱+硬件介绍 【Banana Pi BPI-RV2开发板
    发表于 09-17 10:58

    【作品精选】2025电子发烧友开发板测评大赛作品合集!

    Milk-V Duo S 开发板免费试用 玄铁Banana Pi BPI-RV2开发板试用 玄铁Banana Pi BPI-CanMV-K2
    发表于 09-03 15:24

    【作品合集】五科技CF5010RBT60开发板测评

    CF5010RBT60开发板试用体验】ADC测试 【五科技CF5010RBT60开发板试用体验
    发表于 09-01 14:48

    有奖丨米尔 瑞芯RK3506开发板免费试用来啦!

    米尔与瑞芯合作发布的新品基于瑞芯RK3506应用处理器的MYD-YR3506开发板免费试用名额增加啦
    的头像 发表于 07-10 08:03 644次阅读
    有奖丨米尔 瑞芯<b class='flag-5'>微</b>RK3506<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>来啦!

    有奖丨米尔 瑞芯RK3506开发板免费试用

    米尔与瑞芯合作发布的新品基于瑞芯RK3506应用处理器的MYD-YR3506开发板免费试用名额来啦~~米尔提供了3块价值299元的MYD-YR3506
    的头像 发表于 06-19 08:04 853次阅读
    有奖丨米尔 瑞芯<b class='flag-5'>微</b>RK3506<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    爱芯32位MCU开发板AiP32RV15X介绍

    AiP32RV15X开发板是一款基于RISCV内核的32位MCU开发板,提供了板载调试器、RESET、WAKEUP按键、三色LED、CAN收发器、USB接口、UART、ADC、SPI、
    的头像 发表于 06-17 10:54 609次阅读
    中<b class='flag-5'>微</b>爱芯32位MCU<b class='flag-5'>开发板</b>AiP32<b class='flag-5'>RV</b>15X介绍

    有奖丨米尔 瑞芯RK3562开发板免费试用新增名额!

    米尔与瑞芯合作发布的新品基于瑞芯RK3562应用处理器的MYD-YR3562开发板免费试用名额增加
    的头像 发表于 06-13 08:04 854次阅读
    有奖丨米尔 瑞芯<b class='flag-5'>微</b>RK3562<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>新增名额!

    基于RK3576处理器,米尔RK3576开发板免费试用

    年7月19日   评测数量: 3块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-09 15:00 932次阅读
    基于RK3576处理器,米尔RK3576<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    性能强悍!合众HZ-RK3568开发板试用体验

    月19日   评测数量: 10块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-05 16:30 1106次阅读
    性能强悍!合众HZ-RK3568<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验

    RISC-V开发板五科技CF5010RBT60开发板免费试用

    的工业级环境温度需求。 支持4个 UART、2个 SPI、2个 I2C、1个CAN等通信接口 集成高精度模拟单元 12bit 2Msps ADC,可实现动态高精度实时采样,充分满足物联
    发表于 06-03 17:53

    【评测试用】合众HZ-T536开发板免费试用体验

    【评测试用】合众HZ-T536开发板免费试用体验
    的头像 发表于 05-27 08:05 696次阅读
    【评测<b class='flag-5'>试用</b>】合众HZ-T536<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>体验

    基于RV1126开发板实现驾驶员行为检测方案

    RV1126开发板实现驾驶员行为检测:通过图像识别出这几种行为:打电话、抽烟、疲劳驾驶。
    的头像 发表于 04-18 17:47 354次阅读
    基于<b class='flag-5'>RV</b>1126<b class='flag-5'>开发板实现</b>驾驶员行为检测方案

    基于RV1126开发板的按键测试方法与例程

    RV1126开发板的按键测试方法与例程详细描述
    的头像 发表于 04-15 17:03 831次阅读
    基于<b class='flag-5'>RV</b>1126<b class='flag-5'>开发板</b>的按键测试方法与例程

    有奖丨米尔 瑞芯YR3562开发板免费试用

    米尔与瑞芯合作发布的新品基于瑞芯RK3562应用处理器的MYD-YR3562开发板免费试用活动来啦~~米尔提供了3块价值599元的MYD-YR3562
    的头像 发表于 03-20 08:05 806次阅读
    有奖丨米尔 瑞芯<b class='flag-5'>微</b>YR3562<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>