聚丰项目 > 基于CH32V103R 开发板的数据采集
最近在做医疗制品分公司的MES项目,需要读取设备的能耗等数据,因为部分设备比较老旧,无法直接获取相关数据,需要通过传感器和控制器获取,考虑到设备数量较大,如果采用单片机经济性会比较高,正好得知RTT大赛的消息,有幸申请到了一片沁恒微电子的CH32V103R-R1开发板,希望国产的RISC-V架构的芯片能尽快替代进口。也希望国产的软件及生态能尽快建立起来。
jf_38023859
分享jf_38023859
团队成员
sl 工程师
硬件部分主要包括以下三部分:
(1)主控装置:CH32V103R-R1开发板
(2)输入分压:精密电阻分压器
(3)传感器:电流互感器,温度传感器、湿度传感器
这个MES应用中,需采集设备的参数,这里就利用开发板实现将传感器输出的设备电压,电流、功率、压力、流量、温度、湿度等模拟量信号,转换成数字量信号,通过串口通信传递给上位机。
核心的功能就是ADC和uart。
找到了ADC的例程,例程中有4路输入,指南上给的技术参数显示,这个开发板的芯片有16路12位外部ADC通道,和两路内部通道。
将程序修改为16路ADC规则通道采集。
// 配置 ADC 通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 11, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 12, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 13, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 14, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 15, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 16, ADC_SampleTime_55Cycles5);
主程序:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USARTx_CFG();
Delay_Ms(100);
USARTx_SendStr(USART2, "This is a test data_MADC.\n");
Delay_Init();
USART_Printf_Init(115200);
ADC_DMA_CONF();
printf("SystemClk:%d\r\n",SystemCoreClock);
printf("\r\n ADC多通道DMA读取测试 \r\n");
while (1)
{
//
char str[500];
sprintf(str,"ADC1:%d,ADC2:%d,ADC3:%d,ADC4:%d,ADC5:%d,ADC6:%d,ADC7:%dADC8:%d,ADC9:%d,ADC10:%d,ADC11:%d,ADC12:%d,ADC13:%d,ADC14:%d,ADC15:%d,ADC16:%d \r\n", Get_Adc_Average(ADC_ConvertedValue[0],10),ADC_ConvertedValue[1],ADC_ConvertedValue[2],ADC_ConvertedValue[3],ADC_ConvertedValue[4],ADC_ConvertedValue[5],ADC_ConvertedValue[6],ADC_ConvertedValue[7],ADC_ConvertedValue[8],ADC_ConvertedValue[9],ADC_ConvertedValue[10],ADC_ConvertedValue[11],ADC_ConvertedValue[12],ADC_ConvertedValue[13],ADC_ConvertedValue[14],ADC_ConvertedValue[15]);
printf("ADC1:%d,ADC2:%d,ADC3:%d,ADC4:%d,ADC5:%d,ADC6:%d,ADC7:%dADC8:%d,ADC9:%d,ADC10:%d,ADC11:%d,ADC12:%d,ADC13:%d,ADC14:%d,ADC15:%d,ADC16:%d \r\n", Get_Adc_Average(ADC_ConvertedValue[0],10),ADC_ConvertedValue[1],ADC_ConvertedValue[2],ADC_ConvertedValue[3],ADC_ConvertedValue[4],ADC_ConvertedValue[5],ADC_ConvertedValue[6],ADC_ConvertedValue[7],ADC_ConvertedValue[8],ADC_ConvertedValue[9],ADC_ConvertedValue[10],ADC_ConvertedValue[11],ADC_ConvertedValue[12],ADC_ConvertedValue[13],ADC_ConvertedValue[14],ADC_ConvertedValue[15]);
USARTx_SendStr(USART2, str);
Delay_Ms(500);