在线时间65 小时
UID328519
注册时间2011-11-15
NXP金币0
TA的每日心情 | 开心 2018-6-15 16:35 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
高级会员

- 积分
- 549
- 最后登录
- 2023-3-11
|
本帖最后由 yinyue01 于 2017-5-15 11:29 编辑
锂电池在线监测系统可实时采集锂电池的充放电电流、电压,和环境信号,通过信号调理和数据处理,并将数据实时传输至PC。
充放电电流、电压的采集采用CT/VT+信号调理电路实现,电压采用跟随器电路,这里给出电流采集电路的初步设计。
电流采集电路实现将电流转换为合适的电压该信号输入LPC54114,使其满足ADC采样和后处理的要求。信号调理电路包括I-V转换、低通滤波、程控放大和限幅电路,如下图所示。
需监测的锂电池输出的电流为直流,1A以内。T1为霍尔直流电流互感器,其二次侧电流经U1构成的I-V转换电路转换为电压V1,C1主要起相位补偿作用;V1经由U2A构成的二阶低通滤波电路滤除交流成分;V2经由U3构成的程控放大电路转换为适当的电压V3,U3由GPIO控制;V3经过电压跟随器减小输出阻抗,连接到LPC54114的ADC。D5和D6对输入LPC54102 ADC的电压进行限幅,以免损坏LPC54114。
实际采用2个电位器模拟信号调理电路输出的2路信号,范围均为0-3.3V。环境信号采用板载的pct2075采集温度。采集到的数据在TFT LCD上显示,并通过串口发送到PC。
LPC54114接口设计如下:
PIO1_3:电位器1
PIO1_4:电位器2
PIO1_1:pct2075 SCL
PIO1_2:pct2075 SDA
PIO0_11:TFT SCL
PIO0_12:TFT SDA
PIO0_14:TFT CS
PIO1_8:TFT A0
所使用的LCD为1.8寸128*160的TFT,采用SPI接口驱动,主要引脚有:
RESET:复位,高电平有效
CS:片选,低电平有效
A0:寄存器选择
SDA:数据接收
SCL:SPI总线时钟
LED+,LED-:背光电源
驱动芯片为ILI9163,控制模式为:4线8bit串行总线方式。如下图所示:
每次传输的8bit可以是命令,也可以是数据,通过A0线来选择:A0为低电平,则TB代表命令;A0为高电平,则TB代表数据。
驱动ILI9163的TFT屏只需要主机发送数据,因此SPI口接3根线即可:片选SSEL0、时钟SCK、主机输出MOSI。此外还要用1个GPIO口连接到TFT屏的A0(寄存器选择)。
使用SPI3口连接TFT,SPI配置如下:
- void Init_SPI_PinMux(void)
- {
- /* SPI3 pins */
- IOCON_PinMuxSet(IOCON, 0, 14, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_CS - LCD */
- IOCON_PinMuxSet(IOCON, 0, 11, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_SCK */
- IOCON_PinMuxSet(IOCON, 0, 12, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MOSI */
- IOCON_PinMuxSet(IOCON, 0, 13, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN)); /* SPI3_MISO */
- }
复制代码- void SPI_Init(void)
- {
- spi_master_config_t masterConfig = {0};
-
- /* attach 12 MHz clock to SPI3 */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3);
- /* reset FLEXCOMM for SPI */
- RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn);
- Init_SPI_PinMux();
-
- SPI_MasterGetDefaultConfig(&masterConfig);
- masterConfig.direction = kSPI_MsbFirst;
- masterConfig.polarity = kSPI_ClockPolarityActiveHigh;
- masterConfig.phase = kSPI_ClockPhaseFirstEdge;
- masterConfig.baudRate_Bps = SPI_BITRATE;
- masterConfig.sselNum = kSPI_Ssel0;
- masterConfig.dataWidth = kSPI_Data8Bits;
- SPI_MasterInit(SPI3, &masterConfig, CLOCK_GetFreq(kCLOCK_Flexcomm3));
- }
复制代码 ADC配置2个通道,对应ADC0_6和ADC0_7:
- IOCON_PinMuxSet(IOCON, 1, 3, IOCON_MODE_INACT | IOCON_FUNC0 | IOCON_ANALOG_EN | IOCON_INPFILT_OFF);
- IOCON_PinMuxSet(IOCON, 1, 4, IOCON_MODE_INACT | IOCON_FUNC0 | IOCON_ANALOG_EN | IOCON_INPFILT_OFF);
复制代码- /* Configure the converter. */
- adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */
- adcConfigStruct.clockDividerNumber = 1; /* The divider for sync clock is 2. */
- adcConfigStruct.resolution = kADC_Resolution12bit;
- adcConfigStruct.enableBypassCalibration = false;
- adcConfigStruct.sampleTimeNumber = 0U;
- ADC_Init(ADC0, &adcConfigStruct);
- /* Use the sensor input to channel 0. */
- ADC_EnableTemperatureSensor(ADC0, true);
- /* Enable channel 0's conversion in Sequence A. */
- adcConvSeqConfigStruct.channelMask = (1U << ADC_CHANNEL_NUM[0]) | (1U << ADC_CHANNEL_NUM[1]); /* Includes channel 0. */
- adcConvSeqConfigStruct.triggerMask = 0U;
- adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityNegativeEdge;
- adcConvSeqConfigStruct.enableSingleStep = false;
- adcConvSeqConfigStruct.enableSyncBypass = false;
- adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence;
- ADC_SetConvSeqAConfig(ADC0, &adcConvSeqConfigStruct);
- ADC_EnableConvSeqA(ADC0, true); /* Enable the conversion sequence A. */
复制代码 采用软件中断方式读取ADC采样值:
- uint16_t adc_read(uint16_t num)
- {
- gAdcResultInfoStruct.channelNumber = num;
- ADC_DoSoftwareTriggerConvSeqA(ADC0);
- /* Wait for the converter to be done. */
- while (!ADC_GetChannelConversionResult(ADC0, num, &gAdcResultInfoStruct))
- {
- }
- return (gAdcResultInfoStruct.result&0x0FFF);
- }
复制代码- void ADC0_SEQA_IRQHandler(void)
- {
- if (kADC_ConvSeqAInterruptFlag == (kADC_ConvSeqAInterruptFlag & ADC_GetStatusFlags(ADC0)))
- {
- ADC_GetChannelConversionResult(ADC0, gAdcResultInfoPtr->channelNumber, gAdcResultInfoPtr);
- ADC_ClearStatusFlags(ADC0, kADC_ConvSeqAInterruptFlag);
- bADCSampleFlag = 1;
- }
- }
复制代码 pct2075温度采集采用demo中的IIC程序。
硬件接线及运行结果如下:
LPC54114PRJ.zip
(10.19 MB, 下载次数: 52)
|
|