本文来源电子发烧友社区,作者: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寄存器中。
二、ADC功能
三、库函数介绍
ADC共有4个库函数
复制代码
四、轮流读取各通道数据功能实现
四、总结
到此,本次试用按计划完成开发板的学习试用,相关UART的接收发送程序参考之前的文章,比如设置值如何用串口更新,如何将采样值发送出去。
通过本次试用感受到国产芯片的进步。其外设使用的便利性,为我们开发缩短周期。但是芯片配套生态系统对比进口芯片明显不足,缺少初始化配置软件,用户手册编写比较简单,内容不够充实,排版不能较好结合开发人员的思路,另外官方提供的库函数存在较为明显的BUG。
希望有更多的网友一起在后续使用中共同探讨CSM32RV20,也希望厂商能尽快对接国际大厂的发展思路,对相关软件进行研发升级,对芯片的BUG进行改进。
最后感谢南京中科微和电子发烧友提供这个机会,以上仅代表个人现阶段想法,如有不妥,请及时指出,有任何建议,欢迎最下方留言区留言!
本次实验旨在利用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寄存器中。
二、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个库函数
-
中断处理函数
- void ADC_IRQHandler(void)
- {
- if(ADC->ISR&0x04)//
- {
- ADC->CR &= ~0x02; //软件关闭ADC
- //adc_result = ADC->DR;
- //GPIO_Toggle(GPIOA,PIN9);
- }
- }
-
初始化函数
- void ADC_Init_case1(void)//内部基准,测量PA4输入电压
- {
- ADC->CCR = 0<<20 //CCR[21:20]----------测试控制:00-关闭,01-VREFP输出,10-VREFN输出,11-Vt温度传感器输出
- |1<<19 //CCR[19]---------内部通道增益:0-1,1-1/4
- |0<<16 //CCR[21:20]-----------PGA增益:000-1,001-2,010-4......111-128
- |1<<13 //CCR[15:13]------内部基准选择:0-(1.7~0.498V),1-(1.214~0V)
- |0<<12 //CCR[12]-------------基准来源:0-内部基准,1-外部基准
- |0<<8 //CCR[11:8]---------转换前延时:0000-不延时,0001-2^0个ADC时钟,0010-2^1个ADC时钟...1111-2^14个ADC时钟
- |3<<6 //CCR[7:6]------------时钟分频:00-不分频,01-2分频...11-8分频(时钟<=4M)
- |0<<5 //CCR[5]1/2VDD电压采集通道使能:0-关闭,1-使能
- |0<<4 //CCR[4]----------GPIO触发模式:0-上升沿触发,1-下降沿触发
- |0<<2 //CCR[7:6]----------触发信号源:00-软件触发,01/10-保留,11-GPIO触发
- |0<<1 //CCR[1]--------------采样模式:0-单次模式,1-连续模式
- |1<<0; //CCR[0]--------------电源开关:0-OFF,1-ON
- Delay32M_us(20);//ADC电源开启需要时间
- 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,其它-无
- ADC->IER |= 0<<2 //IER[2]--------中断使能:0-非中断模式,1-中断模式,默认为0;
- GPIO_MODE_Init(GPIOA,PIN4,GPIO_MODE_ANALOG);//设置GPIO为ADC输入
- }
-
功能函数
通过ADC_Conversion(void)函数可实现ADC软启动,并返回采样值,ADC最大分辨率为16位,数据存放在ADC_DR寄存器,采用小端对齐。- uint32_t ADC_Conversion(void)//适用于非中断模式
- {
- uint32_t adc_result;
- //控制寄存器
- ADC->CR = 1; //1:开启转换,0:结束转换
- while(!(ADC->ISR&0x04));
- adc_result = ADC->DR;
- return adc_result;
- }
库函数中软软件触发程序有误,应该将ADC_CR[0]置1启动,程序里写成将ADC_CR[1]置1启动。
应修改如下:- void ADC_Soft_Start(void)//软件触发ADC,适用于中断模式
- {
- ADC->CR |= 0x01;
- }
四、轮流读取各通道数据功能实现
-
修改初始化函数如下:
- ADC_Init(uint32_t ch)
- {
- ADC->CCR = 0<<20 //CCR[21:20]----------测试控制:00-关闭,01-VREFP输出,10-VREFN输出,11-Vt温度传感器输出
- |1<<19 //CCR[19]---------内部通道增益:0-1,1-1/4
- |0<<16 //CCR[21:20]-----------PGA增益:000-1,001-2,010-4......111-128
- |1<<13 //CCR[15:13]------内部基准选择:0-(1.7~0.498V),1-(1.214~0V)
- |0<<12 //CCR[12]-------------基准来源:0-内部基准,1-外部基准
- |0<<8 //CCR[11:8]---------转换前延时:0000-不延时,0001-2^0个ADC时钟,0010-2^1个ADC时钟...1111-2^14个ADC时钟
- |3<<6 //CCR[7:6]------------时钟分频:00-不分频,01-2分频...11-8分频(时钟<=4M)
- |0<<5 //CCR[5]1/2VDD电压采集通道使能:0-关闭,1-使能
- |0<<4 //CCR[4]----------GPIO触发模式:0-上升沿触发,1-下降沿触发
- |0<<2 //CCR[7:6]----------触发信号源:00-软件触发,01/10-保留,11-GPIO触发
- |0<<1 //CCR[1]--------------采样模式:0-单次模式,1-连续模式
- |1<<0; //CCR[0]--------------电源开关:0-OFF,1-ON
- Delay32M_us(20);//ADC电源开启需要时间
- 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,其它-无
- if(ch>2&ch<9)
- {GPIO_MODE_Init(GPIOA,ch,GPIO_MODE_ANALOG)}//设置GPIO为ADC输入
- else if(ch=10)
- {GPIO_MODE_Init(GPIOA,PIN12,GPIO_MODE_ANALOG)}
- }
-
实现多通道采样
- uint32_t ch_value[3];
- /*初始化通道1*/
- ADC_Init(1);
- /*获取通道1数据*/
- ch_value[0] = ADC_Conversion();
- Delay32M_us(20);
- /*初始化通道2*/
- ADC_Init(2);
- /*获取通道2数据*/
- ch_value[1] = ADC_Conversion();
- /*初始化通道3*/
- ADC_Init(3);
- /*获取通道3数据*/
- ch_value[2] = ADC_Conversion();
- /*通过串口1发送3个通道数据*/
- Uart_Send(UART1ch_value,3);
-
实现比较控制
/*当输入模拟量不在设置值中时,对应报警灯亮*/
/*初始化设置值,数组前一位为上限,后一位为下限*/- uint32_t SET1_value[2];
- uint32_t SET2_value[2];
- uint32_t SET3_value[2];
- SET1_value[0] = 5;
- SET1_value[1] =25;
- SET2_value[0] = 5;
- SET2_value[1] =25;
- SET3_value[0] = 5;
- SET3_value[1] =25;
- if(ch_value[0]>SET1_value[0] &ch_value[1][1]>
- GPIO_Write(GPIOA,PIN9,GPIO_RESET);
- else
- GPIO_Write(GPIOA,PIN9,GPIO_SET);
- if(ch_value[1]>SET2_value[0] &ch_value[1][1]>
- GPIO_Write(GPIOA,PIN11,GPIO_RESET);
- else
- GPIO_Write(GPIOA,PIN11,GPIO_SET);
- if(ch_value[2]>SET3_value[0] &ch_value[1][1]>
- GPIO_Write(GPIOA,PIN13,GPIO_RESET);
- else
- GPIO_Write(GPIOA,PIN13,GPIO_SET);
四、总结
到此,本次试用按计划完成开发板的学习试用,相关UART的接收发送程序参考之前的文章,比如设置值如何用串口更新,如何将采样值发送出去。
通过本次试用感受到国产芯片的进步。其外设使用的便利性,为我们开发缩短周期。但是芯片配套生态系统对比进口芯片明显不足,缺少初始化配置软件,用户手册编写比较简单,内容不够充实,排版不能较好结合开发人员的思路,另外官方提供的库函数存在较为明显的BUG。
希望有更多的网友一起在后续使用中共同探讨CSM32RV20,也希望厂商能尽快对接国际大厂的发展思路,对相关软件进行研发升级,对芯片的BUG进行改进。
最后感谢南京中科微和电子发烧友提供这个机会,以上仅代表个人现阶段想法,如有不妥,请及时指出,有任何建议,欢迎最下方留言区留言!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
南京中科微
+关注
关注
0文章
60浏览量
740 -
CSM32RV20
+关注
关注
0文章
40浏览量
206
发布评论请先 登录
相关推荐
追加名额丨米尔瑞芯微RK3576开发板有奖试用
米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动加码啦~~米尔追加了2块价值849元的MYD-LR3576
常用在工业控制系统上的MCU芯片资料:CSM32RV20
CSM32RV20是一款基于RISC-V核的低功耗MCU芯片。 内置RISC-V RV32IMAC内核(2.6CoreMark/MHz); 蕞高32MHz工作频率; 内置4kB的SRAM; 内置8B
有奖丨米尔 瑞芯微RK3576开发板免费试用
米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动来啦~~米尔提供了7块价值849元的MYD-LR3576
基于恩智浦FRDM-MCXA153开发板实现RT-Thread的ADC驱动
数转换器(ADC)是现代嵌入式系统中不可或缺的组件,它能将连续的模拟信号转换为离散的数字信号。本文将深入探讨如何在NXP的FRDM-MCXA153开发板上实现和使用RT-Thread的
扩展电网应用中的模拟输入通道(使用16通道、16位、1MSPS双路同步采样ADC)
电子发烧友网站提供《扩展电网应用中的模拟输入通道(使用16通道、16位、1MSPS双路同步采样ADC).pdf》资料免费下载
发表于 09-21 10:05
•0次下载
使用单通道ADC+模拟开关结构采样多路信号时,ADC采样率如何选择呢?
现在有10路信号需要采样,每个通道的信号带宽都是10K,采集电路准备使用模拟开关+单通道ADC结构,考虑
发表于 08-15 07:02
点击参与米尔NXP i.MX 93开发板有奖试用
米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了3块价值678元的MYD-LMX9X开发板发起试用活动您不仅可以免费体
【GD32F303红枫派开发板使用手册】第十二讲 ADC-双轴按键摇杆多通道循环采样实验
本实验是通过ADC规则组多通道循环采样方式实现双轴按键摇杆传感器x和y轴电压值的读取,通过本实验主要学习以下内容:
•双轴按键摇杆传感器工作原理
•DMA原理
规则组多
AD7616的16路采样通道,如何实现对通道状态的实时自检,监测通道状态是否正常?
AD7616的16路采样通道,如何实现对通道状态的实时自检,监测通道状态是否正常?
1)手册中通信自测功能是不是
发表于 05-27 08:07
【GD32H757Z海棠派开发板使用手册】第八讲 ADC-规则组多通道采样实验
通过本实验主要学习以下内容:
ADC的简介
GD32FH757 ADC工作原理
DMA和DMAMUX的原理
规则组多通道循环采样
评论