聚豐項(xiàng)目 > 基于CH32V103R 開發(fā)板的數(shù)據(jù)采集
最近在做醫(yī)療制品分公司的MES項(xiàng)目,需要讀取設(shè)備的能耗等數(shù)據(jù),因?yàn)椴糠衷O(shè)備比較老舊,無法直接獲取相關(guān)數(shù)據(jù),需要通過傳感器和控制器獲取,考慮到設(shè)備數(shù)量較大,如果采用單片機(jī)經(jīng)濟(jì)性會(huì)比較高,正好得知RTT大賽的消息,有幸申請(qǐng)到了一片沁恒微電子的CH32V103R-R1開發(fā)板,希望國產(chǎn)的RISC-V架構(gòu)的芯片能盡快替代進(jìn)口。也希望國產(chǎn)的軟件及生態(tài)能盡快建立起來。
jf_38023859
jf_38023859
團(tuán)隊(duì)成員
sl 工程師
硬件部分主要包括以下三部分:
(1)主控裝置:CH32V103R-R1開發(fā)板
(2)輸入分壓:精密電阻分壓器
(3)傳感器:電流互感器,溫度傳感器、濕度傳感器
這個(gè)MES應(yīng)用中,需采集設(shè)備的參數(shù),這里就利用開發(fā)板實(shí)現(xiàn)將傳感器輸出的設(shè)備電壓,電流、功率、壓力、流量、溫度、濕度等模擬量信號(hào),轉(zhuǎn)換成數(shù)字量信號(hào),通過串口通信傳遞給上位機(jī)。
核心的功能就是ADC和uart。
找到了ADC的例程,例程中有4路輸入,指南上給的技術(shù)參數(shù)顯示,這個(gè)開發(fā)板的芯片有16路12位外部ADC通道,和兩路內(nèi)部通道。
將程序修改為16路ADC規(guī)則通道采集。
// 配置 ADC 通道轉(zhuǎn)換順序?yàn)?/span>1,第一個(gè)轉(zhuǎn)換,采樣時(shí)間為55.5個(gè)時(shí)鐘周期
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);