[经验分享] 基于【EVAL-ADICUP360】的毫欧计-程序设计

fxyc87   2022-10-24 13:11 楼主

下位机主要是将AIN5输出1mA恒流,但不知道为什么输出的电流不准,在200uA以内时,实测特别准确,但超过200uA时就不准了,实际电流偏高。也没有在官方找到正确答案。

1mA实测电流为1.081mA。超出官方说的5%。不过不影响,有实测结果就行。

AIN5输出1mA恒流,接到目标电阻+极,负极接GND,原理图参见我上个贴子。

测出的AD数据通过串口发送至上位机,目标板自带了CMSIS-DAP,并有串口。

通过板上的紫色LED闪烁指示运行状态。

代码如下:


#include "ADuCM360.h"
#include "DioLib.h"
#include "DacLib.h"
#include "AdcLib.h"
#include "IexcLib.h"
#include "UrtLib.h"
#include "DmaLib.h"

#include "string.h"
#include "stdio.h"

char uart_tx_bf[256];
uint32_t sysTick=0;
uint32_t delayCount=0;


uint32_t ad;
void PrintStr();		//打印发送缓冲区的字符串

int main(void){
	SystemCoreClockUpdate();		//SystemCoreClock
	SysTick_Config(SystemCoreClock/1000);
	
	//串口配置==============================
	UrtCfg(pADI_UART,B115200,COMLCR_WLS_8BITS,0);
	//p0.1 p0.2  uart模式		只有一个UART,可分配有两块引脚上。		p0.6/p0.7
	DioCfgPin(pADI_GP0,PIN1,3);
	DioCfgPin(pADI_GP0,PIN2,3);
	
	//紫色LED灯 输出模式
	DioDrv(pADI_GP0,BIT4,0,0);
	
	
	//电流源配置==============================
	//掉电关,参考源选择内部,输出0选AIN7,输出1选择AIN6
	IexcCfg(IEXCCON_PD_off,IEXCCON_REFSEL_Int,IEXCCON_IPSEL1_AIN5,IEXCCON_IPSEL1_Off);		
	//电流源200uA,辅助10uA禁用 电流源可配置为0.01mA-1mA		AIN4/5/6/7可配置为电流源输出
	IexcDat(IEXCDAT_IDAT_1mA,IDAT0Dis);
	
	
	
	//DAC配置==============================
	//DacCfg(DACCON_CLR_Off,DACCON_RNG_IntVref,DACCON_CLK_HCLK,DACCON_MDE_16BitSlow);
	
	
	
	//AD1引脚配置==============================
	//ad1 -AIN1 +AIN3
	AdcPin(pADI_ADC1,ADCCON_ADCCN_AGND,ADCCON_ADCCP_AIN0);
	
	/*
	//偏置电压选择		AIN7/AIN11  DVDD(1.8v)/2=0.9V
	AdcBias(pADI_ADC1,ADCCFG_PINSEL_AIN11,ADC_BIAS_X1,ADC_GND_OFF);
	*/
	
	//缓冲	参考电压
	//AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPP|ADCCON_BUFBYPN);
	//放大倍数,有无符号
	//AdcRng(pADI_ADC0,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G128,ADCCON_ADCCODE_UINT);
	//ADC配置 外部参考源
	AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G128,ADCCON_ADCCODE_UINT);
	
	//float q=(float)1200/(float)0x3FFFFF;		//内部基准系数
	
	//测试DAC
	/*
	AdcPin(pADI_ADC1,ADCCON_ADCCN_AGND,ADCCON_ADCCP_DAC);
	AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPP);
	AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G1,ADCCON_ADCCODE_UINT);
	float q=(float)1200/(float)0xfffffff;
	*/
	
	
	//满量程 G=8=125mV 0x7ffffff 28bit
	//G=16 =62.5mV
	//G=32 =22.18mV 
	//k型热电偶 1000度=41.23mV
//	uint16_t da=32768;		//0.6V
//	DacWr(0,da<<12);

	//ADC零点校准
	AdcGo(pADI_ADC1,ADCMDE_ADCMD_INTOCAL);
	while((AdcSta(pADI_ADC1)&(1<<5))==0);			//bit5 or ADCxSTA_CAL
	
	AdcGo(pADI_ADC1,ADCMDE_ADCMD_SINGLE);
	while(1){
		if(delayCount==0){
			DioTgl(pADI_GP0,BIT4);
			delayCount=500;
		}
		
		if(AdcSta(pADI_ADC1)&1){		//bit0 or ADCxSTA_RDY
			ad= AdcRd(pADI_ADC1);

			sprintf(uart_tx_bf,"%d\r\n",ad);
			PrintStr();

			AdcGo(pADI_ADC1,ADCMDE_ADCMD_SINGLE);
		}


	}
	
	

	
	

}


void PrintStr(){		//打印发送缓冲区的字符串
	char * ptr=uart_tx_bf;
	while(*ptr){
		UrtTx(pADI_UART,*ptr);
		ptr++;
		while((UrtLinSta(pADI_UART)&COMLSR_THRE)==0);
	}
}
void SysTick_Handler(){
	sysTick++;
	if(delayCount>0)
		delayCount--;
}

//end

 

回复评论 (1)

超过200uA时就不准这个问题

 

另外程序代码中间插入空行有点多

 

点赞  2022-10-25 08:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复