下位机主要是将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