查看: 7281|回复: 9

[原创] 【LPC54114】锂电池在线监测系统

[复制链接]
  • TA的每日心情
    开心
    2018-6-15 16:35
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    50

    主题

    159

    帖子

    0

    高级会员

    Rank: 4

    积分
    549
    最后登录
    2023-3-11
    发表于 2017-5-10 23:42:33 | 显示全部楼层 |阅读模式
    本帖最后由 yinyue01 于 2017-5-15 11:29 编辑

    锂电池在线监测系统可实时采集锂电池的充放电电流、电压,和环境信号,通过信号调理和数据处理,并将数据实时传输至PC。
    充放电电流、电压的采集采用CT/VT+信号调理电路实现,电压采用跟随器电路,这里给出电流采集电路的初步设计。
    电流采集电路实现将电流转换为合适的电压该信号输入LPC54114,使其满足ADC采样和后处理的要求。信号调理电路包括I-V转换、低通滤波、程控放大和限幅电路,如下图所示。
    2.png
    需监测的锂电池输出的电流为直流,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串行总线方式。如下图所示:

    3.JPG
    每次传输的8bit可以是命令,也可以是数据,通过A0线来选择:A0为低电平,则TB代表命令;A0为高电平,则TB代表数据。
    驱动ILI9163的TFT屏只需要主机发送数据,因此SPI口接3根线即可:片选SSEL0、时钟SCK、主机输出MOSI。此外还要用1个GPIO口连接到TFT屏的A0(寄存器选择)。
    使用SPI3口连接TFT,SPI配置如下:
    1. void Init_SPI_PinMux(void)
    2. {
    3.                 /* SPI3 pins */
    4.         IOCON_PinMuxSet(IOCON, 0, 14, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_CS - LCD */
    5.         IOCON_PinMuxSet(IOCON, 0, 11, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_SCK        */
    6.         IOCON_PinMuxSet(IOCON, 0, 12, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_MOSI       */
    7.         IOCON_PinMuxSet(IOCON, 0, 13, (IOCON_FUNC1 | IOCON_MODE_PULLUP | IOCON_GPIO_MODE | IOCON_DIGITAL_EN));  /* SPI3_MISO       */
    8. }
    复制代码
    1. void SPI_Init(void)
    2. {
    3.         spi_master_config_t masterConfig = {0};
    4.                
    5.         /* attach 12 MHz clock to SPI3 */
    6.         CLOCK_AttachClk(kFRO12M_to_FLEXCOMM3);
    7.   /* reset FLEXCOMM for SPI */
    8.   RESET_PeripheralReset(kFC3_RST_SHIFT_RSTn);
    9.         Init_SPI_PinMux();
    10.         
    11.         SPI_MasterGetDefaultConfig(&masterConfig);
    12.         masterConfig.direction = kSPI_MsbFirst;
    13.         masterConfig.polarity = kSPI_ClockPolarityActiveHigh;
    14.         masterConfig.phase = kSPI_ClockPhaseFirstEdge;
    15.         masterConfig.baudRate_Bps = SPI_BITRATE;
    16.         masterConfig.sselNum = kSPI_Ssel0;
    17.         masterConfig.dataWidth = kSPI_Data8Bits;
    18.         SPI_MasterInit(SPI3, &masterConfig, CLOCK_GetFreq(kCLOCK_Flexcomm3));
    19. }
    复制代码
    ADC配置2个通道,对应ADC0_6和ADC0_7:
    1. IOCON_PinMuxSet(IOCON, 1, 3, IOCON_MODE_INACT | IOCON_FUNC0 | IOCON_ANALOG_EN | IOCON_INPFILT_OFF);
    2.         IOCON_PinMuxSet(IOCON, 1, 4, IOCON_MODE_INACT | IOCON_FUNC0 | IOCON_ANALOG_EN | IOCON_INPFILT_OFF);
    复制代码
    1. /* Configure the converter. */
    2.         adcConfigStruct.clockMode = kADC_ClockSynchronousMode; /* Using sync clock source. */
    3.         adcConfigStruct.clockDividerNumber = 1;                /* The divider for sync clock is 2. */
    4.         adcConfigStruct.resolution = kADC_Resolution12bit;
    5.         adcConfigStruct.enableBypassCalibration = false;
    6.         adcConfigStruct.sampleTimeNumber = 0U;
    7.         ADC_Init(ADC0, &adcConfigStruct);

    8.         /* Use the sensor input to channel 0. */
    9.         ADC_EnableTemperatureSensor(ADC0, true);

    10.         /* Enable channel 0's conversion in Sequence A. */
    11.         adcConvSeqConfigStruct.channelMask = (1U << ADC_CHANNEL_NUM[0]) | (1U << ADC_CHANNEL_NUM[1]); /* Includes channel 0. */
    12.         adcConvSeqConfigStruct.triggerMask = 0U;
    13.         adcConvSeqConfigStruct.triggerPolarity = kADC_TriggerPolarityNegativeEdge;
    14.         adcConvSeqConfigStruct.enableSingleStep = false;
    15.         adcConvSeqConfigStruct.enableSyncBypass = false;
    16.         adcConvSeqConfigStruct.interruptMode = kADC_InterruptForEachSequence;
    17.         ADC_SetConvSeqAConfig(ADC0, &adcConvSeqConfigStruct);
    18.         ADC_EnableConvSeqA(ADC0, true); /* Enable the conversion sequence A. */
    复制代码
    采用软件中断方式读取ADC采样值:
    1. uint16_t adc_read(uint16_t num)
    2. {
    3.         gAdcResultInfoStruct.channelNumber = num;
    4.         ADC_DoSoftwareTriggerConvSeqA(ADC0);
    5.         /* Wait for the converter to be done. */
    6.         while (!ADC_GetChannelConversionResult(ADC0, num, &gAdcResultInfoStruct))
    7.         {
    8.         }        
    9.         return (gAdcResultInfoStruct.result&0x0FFF);
    10. }
    复制代码
    1. void ADC0_SEQA_IRQHandler(void)
    2. {
    3.   if (kADC_ConvSeqAInterruptFlag == (kADC_ConvSeqAInterruptFlag & ADC_GetStatusFlags(ADC0)))
    4.   {
    5.     ADC_GetChannelConversionResult(ADC0, gAdcResultInfoPtr->channelNumber, gAdcResultInfoPtr);
    6.     ADC_ClearStatusFlags(ADC0, kADC_ConvSeqAInterruptFlag);
    7.     bADCSampleFlag = 1;
    8.   }
    9. }
    复制代码
    pct2075温度采集采用demo中的IIC程序。
    硬件接线及运行结果如下:
    3.jpg
    4.jpg
    2.png
    1.png
    LPC54114PRJ.zip (10.19 MB, 下载次数: 52)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-15 16:35
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    50

    主题

    159

    帖子

    0

    高级会员

    Rank: 4

    积分
    549
    最后登录
    2023-3-11
     楼主| 发表于 2017-5-14 23:02:32 | 显示全部楼层

    完善了一下

    本帖最后由 yinyue01 于 2017-5-15 15:57 编辑

    完善了一下,增加了DHT11采集湿度。另外,采用了UM402 UART接口无线数传模块实现了无线数据传输。DHT11为单总线数字温湿度传感器,其数据线直接连接到LPC54114的PIO0_22口。
    UM402为无线串口模块,其RXD口连接LPC54114的PIO0_18口,可实现将LPC54114发出的数据转成无线信号发出。PC通过PL2303 USB转串口线连接另一块UM402,接收LPC54114发出的数据。
    接线图如下:
    微信图片_20170514225739.jpg
    PORT.jpg
    DHT11是串行单总线数字温湿度传感器,与MCU通信时序如下:
    224512hlshnz5srv57lwqr_jpg_thumb.jpg
    数字温湿度传感器DHT11采用单总线输出数据,单次数据包共5Byte(40bit),包括先发送高位,数据格式为:湿度整数+湿度小数+温度整数+温度小数+校验和,各占1 Byte,校验和为前4个Byte相加,由此可计算出温湿度的数值。
    DHT11通讯过程的时序图如下图所示,空闲状态时总线为高电平,MCU发送开始信号,拉低总线等待DHT11响应(至少18ms),之后拉高总线20~40μs;DHT11接收到开始信号,在其结束后发送80μs的低电平响应信号,之后拉高总线40~50μs,再拉低40~50μs,接着输出数据;主机读取到响应信号后开始接收数据;一次数据传输完成,DHT11拉低总线50μs,之后总线进入空闲状态。

    根据以上分析,编写DHT11数据采集程序:
    1. #define        DHT11_Port        0
    2. #define        DHT11_Pin        22                                                           
    3. #define        DHT11_DQ_OUT (GPIO->B[DHT11_Port][DHT11_Pin]) //数据端口
    4. #define        DHT11_DQ_IN  (GPIO_ReadPinInput(GPIO,DHT11_Port,DHT11_Pin))          //数据端口

    5. uint8_t DHT11_Init(void);//初始化DHT11
    6. uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);//读取温湿度
    7. uint8_t DHT11_Read_Byte(void);//读出一个字节
    8. uint8_t DHT11_Read_Bit(void);//读出一个位
    9. uint8_t DHT11_Check(void);//检测是否存在DHT11
    10. void DHT11_Rst(void);//复位DHT11
    复制代码
    需要注意的是,DHT11_Rst函数中需要将IO口设置为输出
    1. //复位DHT11
    2. void DHT11_Rst(void)           
    3. {                 
    4.         GPIO->DIR[DHT11_Port] |= 1U << DHT11_Pin;  
    5.         DHT11_DQ_OUT=0;         //拉低DQ
    6.         Delay_us(20000);    //拉低至少18ms
    7.         DHT11_DQ_OUT=1;         //DQ=1
    8.         Delay_us(30);             //主机拉高20~40us
    9. }
    复制代码
    而DHT11_Check函数中需要将IO口设置为输入
    1. //等待DHT11的回应
    2. //返回1:未检测到DHT11的存在
    3. //返回0:存在
    4. uint8_t DHT11_Check(void)            
    5. {   
    6.         uint8_t retry=0;
    7.         GPIO->DIR[DHT11_Port] &= ~(1U << DHT11_Pin);
    8.         //DHT11_IO_IN();//SET INPUT         
    9.     while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
    10.         {
    11.                 retry++;
    12.                 Delay_us(1);
    13.         };         
    14.         if(retry>=100)return 1;
    15.         else retry=0;
    16.     while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
    17.         {
    18.                 retry++;
    19.                 Delay_us(1);
    20.         };
    21.         if(retry>=100)return 1;            
    22.         return 0;
    23. }
    复制代码
    由于DHT11温度采集精度没有板载的pct2075精度高,因此温度采用pct2075的结果。
    UM402 模块是高度集成低功耗半双工小功率无线数据传输模块,其嵌入高速低功耗单片机和高性能扩频射频芯片,内部已经实现了RX接收并无线发送和无线接收并TX发送至PC,不用编写MCU和UM402的通讯程序,只需要配置好LPC54114的串口引脚,并将波特率设置为9600bps(与UM402匹配)即可。
    1.     /* USART5 RX/TX pin */
    2.     IOCON_PinMuxSet(IOCON, 0, 18, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
    3.     IOCON_PinMuxSet(IOCON, 0, 20, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
    复制代码
    1. #define BOARD_DEBUG_UART_TYPE DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM
    2. #define BOARD_DEBUG_UART_BASEADDR (uint32_t) USART5
    3. #define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetFreq(kCLOCK_Flexcomm5)
    4. #define BOARD_DEBUG_UART_CLK_ATTACH kFRO12M_to_FLEXCOMM5
    5. #define BOARD_DEBUG_UART_RST kFC5_RST_SHIFT_RSTn

    6. #define BOARD_DEBUG_SPI_CLK_FREQ 12000000

    7. #ifndef BOARD_DEBUG_UART_BAUDRATE
    8. #define BOARD_DEBUG_UART_BAUDRATE 9600
    9. #endif /* BOARD_DEBUG_UART_BAUDRATE */
    复制代码

    运行结果如下:
    微信图片_20170514225747.jpg
    串口.png
    LPC54114PRJ.zip (10.37 MB, 下载次数: 66)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-15 16:35
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    50

    主题

    159

    帖子

    0

    高级会员

    Rank: 4

    积分
    549
    最后登录
    2023-3-11
     楼主| 发表于 2017-5-15 13:34:37 | 显示全部楼层
    本帖最后由 yinyue01 于 2017-5-15 13:39 编辑

    最后,简单汇总一下LPC54114开发工具:

    1.LPCOpen Libraries:
    1. http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/lpc-cortex-m-mcus/software-tools/lpcopen-libraries-and-examples:LPC-OPEN-LIBRARIES
    复制代码
    需要先编译生成csp和bsp的lib文件,便于开发官方的LPCXpresso开发板,其他板子需要修改bsp或只使用csp
    有1000多页的pdf文档,可配合Keil_v5\ARM\PACK\Keil\LPC54000_DFP\2.2.0\LPCOpen路径下的例程学习。

    2.MCUXpresso SDK:
    需要先选择MCU生成SDK
    http://mcuxpresso.nxp.com/en/welcome
    再结合MCUXpresso Config Tools配置引脚和时钟(个人感觉没有stm32cubemx做得好。)
    http://www.nxp.com/products/soft ... ab=Design_Tools_Tab
    参考手册中有不少配置的实例
    http://mcuxpresso.nxp.com/api_doc/dev/116/index.html
    搜狗截图17年05月15日1333_1.jpg






    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4614
    最后登录
    2021-1-25
    发表于 2017-11-29 13:47:15 | 显示全部楼层
    来看一看
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-2-26 10:03
  • 签到天数: 80 天

    连续签到: 1 天

    [LV.6]常住居民II

    5

    主题

    408

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1421
    最后登录
    2025-6-4
    发表于 2017-12-12 11:51:32 | 显示全部楼层
    厉害了。回头弄个电路试试
    开心每一天
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-1-8 18:28
  • 签到天数: 93 天

    连续签到: 1 天

    [LV.6]常住居民II

    3

    主题

    221

    帖子

    0

    高级会员

    Rank: 4

    积分
    586
    最后登录
    2022-1-8
    发表于 2017-12-13 13:21:00 | 显示全部楼层
    来看一下
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5618
    最后登录
    2021-12-22
    发表于 2017-12-14 15:29:30 | 显示全部楼层
    不错,很好啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-9-15 08:42
  • 签到天数: 1952 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    1

    主题

    4686

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9405
    最后登录
    2023-9-15
    发表于 2017-12-14 19:58:19 | 显示全部楼层
    不错,内容很好!
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2017-12-20 10:57:49 来自手机 | 显示全部楼层
    非常好的资料,学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
    发表于 2018-5-18 11:46:26 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 12:43 , Processed in 0.109041 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表