聚豐項目 > 基于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);