找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17288|回复: 25
收起左侧

BQ24650 MPPT太阳能控制器msp430单片机源码+电路图与PCB文件+LT3478 LED驱动

  [复制链接]
ID:412671 发表于 2018-10-20 12:08 | 显示全部楼层 |阅读模式
MPPT资料包:
0.png

Altium Designer画的msp430单片机主控的BQ24650芯片MPPT太阳能控制器电路原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

msp430单片机源程序如下:
  1. #include <msp430.h>
  2. #include <stdint.h>
  3. #include "eusci_b_i2c.h"
  4. #include "pwm_Ax_Bx.h"
  5. #include "adc.h"
  6. /*
  7. * main.c
  8. */

  9. #define MIN_SHORT_COUNT 1250
  10. #define SHORT_PRESS_COUNT 7812 //at 1Mhz ACLK/8*8  ~1sec
  11. #define LONG_PRESS_COUNT  46875 // ~3 sec
  12. // #define VERY_LONG_PRESS_COUNT   not used as timer over flow is
  13. #define DPOT_I2C_ADDRESS 0x50

  14. struct
  15. {
  16.         uint8_t ison:3;
  17.         uint8_t brightness;
  18.         uint8_t key_event;
  19.         uint8_t output_on;
  20.         uint8_t battery_level;
  21.         uint8_t ischarging;
  22.         uint8_t starting;
  23. }system;


  24. uint8_t calcBatLevel() // return ture if io update is required.
  25. {
  26.         uint8_t retval=0;
  27.         uint16_t vbat=getVBAT();
  28.         vbat+=getVBAT();
  29.         vbat+=getVBAT();
  30.         vbat+=getVBAT();
  31.         vbat = vbat>>2;
  32.         if((!(P3IN&BIT5)) && (!(P3IN&BIT6)))//bider sind nirdig stat1 pin should be low for charing
  33.         {
  34.                 system.ischarging=0;
  35.         }else if( (!(P3IN&BIT5)) && (P3IN&BIT6))
  36.         {
  37.                 system.ischarging=1;
  38.                 retval=1;
  39.         }else{
  40.                 system.ischarging=0;
  41.         }

  42.         if(vbat<MIN_VBAT_LEVEL)
  43.         {
  44.                 system.battery_level=EMPTY;
  45.                 retval=1;
  46.         }else if(vbat<TF_VBAT_LEVEL)
  47.         {
  48.                 system.battery_level=TF_PERCENT;
  49.         }else if(vbat<FF_VBAT_LEVEL)
  50.         {
  51.                 system.battery_level=FF_PERCENT;
  52.         }else if(vbat<SF_VBAT_LEVEL)
  53.         {
  54.                 system.battery_level=SF_PERCENT;
  55.         }else if((P3IN&BIT6) && (system.ischarging==1)) // vbat > SF_VBAT_LEVEL sense corret pin from bq24650
  56.         {
  57.                 system.battery_level=NN_PERCENT;
  58.         }else{

  59.                 system.battery_level=FULL;
  60.         }

  61.         return retval;
  62. }

  63. uint8_t event=0;
  64. static void initClock()
  65. {
  66.            PM5CTL0=0;
  67.     CSCTL0 =0xA500;
  68.    // FRCTL0 = 0xA500 | NWAITS0; //keine warte weil 8Mhz clk
  69.    CSCTL1 |= DCOFSEL_3;  // on reset set to 8MHz
  70.    CSCTL2 = SELA__DCOCLK |  SELS__DCOCLK | SELM__DCOCLK;
  71.    CSCTL3 &= ~(DIVA0 | DIVA1 | DIVA2 | DIVS0 | DIVS1 | DIVS2 | DIVM0| DIVM1 | DIVM2  ); //ACLK, MCLK and SMCLK to be 8Mhz
  72.    CSCTL3 |= DIVA1|DIVA0;  // ACLK /8 ==  1Mhz
  73.    // CSCTL4 = HFXTDRIVE0|HFXTDRIVE1 | HFFREQ1 |LFXTOFF  ;  //drive HFXT to be max power ( kein crytal bei strmsucher V1.0 deshab nicht ben鰐igt)
  74.   // _delay_cycles(5000);
  75.   // CSCTL0 =0x0000;
  76.    SFRIFG1 &=~( OFIFG);
  77. }

  78. void initCCPB0()
  79. {
  80.         TB0CTL = 0;
  81.         TB0CTL = TASSEL__ACLK | ID_3 | MC_2  |TBIE;
  82.         TB0EX0 = TBIDEX_7;
  83.         TB0CCTL2 = 0;
  84.         TB0CCTL2 = CM_3 | CCIS_0  |  OUTMOD_7 |CAP |CCIE;
  85.         TB0CCR0 = 0;
  86.         TB0CCR2 = 0;
  87. }

  88. void initLEDTIMERB1()
  89. {
  90.         TB1CTL = 0;
  91.         TB1CTL = TASSEL__ACLK | ID_3 | MC_2  |TBIE|TBCLR;

  92. }
  93. enum ledstate{STATE0,STATE1,STATE2,STATE3,STATE4,STATE5,STATE_NORM};
  94. static uint8_t init;
  95. #pragma vector = TIMER1_B1_VECTOR                //timer a0 over flor make it trig ever 333ms update display here
  96. __interrupt void led_update(void)
  97. {
  98. static uint8_t blinker;

  99. if(TB1CTL&TBIFG)
  100.                 {
  101.         if (!system.output_on  && system.starting==0 )
  102.         {
  103.                 init=STATE0;
  104.         }
  105.    if(system.ischarging)
  106.         {
  107.                 init=STATE_NORM;

  108.         }
  109.         switch(init)
  110.         {
  111.         case STATE0:
  112.                 P1OUT &=~BIT4;         //led 1
  113.                 P2OUT &= ~(BIT5|BIT6|BIT4); //led 3 led 2
  114.                 //goto sleep
  115.                 init=STATE1;

  116.                 break;
  117.         case STATE1:
  118.                 system.starting=1;

  119.                 //all led on
  120.                 P1OUT |=BIT4;         //led 1
  121.                 P2OUT |=  BIT4|BIT5 |BIT6; //led 3 led
  122.                 init=STATE2;
  123.                 if(system.battery_level==NN_PERCENT||system.battery_level==FULL)
  124.                 {
  125.                         init=STATE_NORM;
  126.                 }
  127.                 break;
  128.         case STATE2:
  129.                 //SWITCH OFF any led
  130.                 //if(system.battery_level==SF_PERCENT||syste.battery_level==NN_PERCENT||syste.battery_level==FULL)
  131.                 P2OUT &=~BIT4;
  132.                 init=STATE3;
  133.                 if(system.battery_level==SF_PERCENT)
  134.                 {
  135.                         init=STATE_NORM;
  136.                 }
  137.                 break;
  138.         case STATE3:
  139.                 P2OUT &= ~BIT5;
  140.                 init=STATE4;
  141.                 if(system.battery_level==FF_PERCENT)
  142.                 {
  143.                         init=STATE_NORM;
  144.                 }
  145.                 break;
  146.         case STATE4:
  147.                 P2OUT &= ~BIT6;
  148.                 init=STATE5;
  149.                 if(system.battery_level==TF_PERCENT)
  150.                 {
  151.                                 init=STATE_NORM;
  152.                 }
  153.                 break;
  154.         case STATE5:
  155.                 P1OUT &=~BIT4;         //led 1
  156.                 init=STATE_NORM;
  157.                 break;
  158.         case STATE_NORM:
  159.                 system.starting=0; //animation finished
  160.                                                         blinker++;
  161.                                                                         if((~blinker)&0x3)
  162.                                                                         {

  163.                                                                                                         if(system.ischarging)                 //turn the leds off if charing
  164.                                                                                                         {
  165.                                                                                                                 switch(system.battery_level)
  166.                                                                                                                         {
  167.                                                                                                                         case EMPTY:
  168.                                                                                                                         case TF_PERCENT: // 0<bat<25
  169.                                                                                                                                 P1OUT &=~BIT4;         //led 1
  170.                                                                                                                                 P2OUT &= ~BIT6; // led 2
  171.                                                                                                                                 P2OUT &= ~(BIT5 );
  172.                                                                                                                                 P2OUT &=~BIT4; //led 1 2 3
  173.                                                                                                                                 break;
  174.                                                                                                                         case FF_PERCENT:
  175.                                                                                                                                 P2OUT &= ~BIT6; // led 2
  176.                                                                                                                                 P2OUT &= ~(BIT5 );
  177.                                                                                                                                 P2OUT &=~BIT4; //led 1 2 3
  178.                                                                                                                                 break;
  179.                                                                                                                         case SF_PERCENT:
  180.                                                                                                                                 P2OUT &= ~(BIT5 );
  181.                                                                                                                                 P2OUT &=~BIT4; //led 1 2 3
  182.                                                                                                                                 break;
  183.                                                                                                                         case NN_PERCENT:
  184.                                                                                                                                 P2OUT &=~BIT4; //led 1 2 3
  185.                                                                                                                                 break;
  186.                                                                                                                         case FULL:
  187.                                                                                                                                 P1OUT |=BIT4;         //led 1
  188.                                                                                                                                 P2OUT |=  BIT4|BIT5 |BIT6; //led 3 led
  189.                                                                                                                                 break;
  190.                                                                                                                         }


  191.                                                                                                         }else
  192.                                                                                                         {

  193.                                                                                                                 P1OUT &=~BIT4;         //led 1
  194.                                                                                                                 P2OUT &= ~(BIT5|BIT6|BIT4); //led 3 led 2

  195.                                                                                                         }
  196.                                                                         }else
  197.                                                                         {


  198.                                                                                                         switch(system.battery_level)
  199.                                                                                                                 {
  200.                                                                                                                 case EMPTY:
  201.                                                                                                                 case TF_PERCENT: // 0<bat<25
  202.                                                                                                                         P1OUT |=BIT4;         //led 1
  203.                                                                                                                         P2OUT &= ~(BIT5|BIT6|BIT4); //led 3 led 2
  204.                                                                                                                         break;
  205.                                                                                                                 case FF_PERCENT: // bat<50%
  206.                                                                                                                         P1OUT |=BIT4;
  207.                                                                                                                         P2OUT |= BIT6;
  208.                                                                                                                         P2OUT &= ~(BIT5|BIT4 );
  209.                                                                                                                         break;
  210.                                                                                                                 case SF_PERCENT: //bat <75%
  211.                                                                                                                         P1OUT |=BIT4;
  212.                                                                                                                         P2OUT |=BIT6 |BIT5;
  213.                                                                                                                         P2OUT &=~BIT4; //led 1 2 3
  214.                                                                                                                         break;
  215.                                                                                                                 case NN_PERCENT: //bat <=100%
  216.                                                                                                                 case FULL:
  217.                                                                                                                         P1OUT |=BIT4;         //led 1
  218.                                                                                                                         P2OUT |=  BIT4|BIT5 |BIT6; //led 3 led
  219.                                                                                                                         break;
  220.                                                                                                                 }

  221.                                                                         }

  222.         }

  223.         //LPM4_EXIT;
  224. TB1CTL &= ~TBIFG;
  225.                 }
  226. }
  227. #define BRIGHTNESS_FIRST_STEP 20
  228. #define BRIGHTNESS_STEP 25
  229. #define MIN_BRIGHTNESS  5
  230. #define MAX_BRIGHTNESS  100




  231. enum events{KEY_EVENT_NONE,KEY_EVENT_SHORT,KEY_EVENT_LONG,KEY_EVENT_VLONG};


  232. #pragma vector = TIMER0_B1_VECTOR                //timer a0 over flor make it trig ever 333ms update display here
  233. __interrupt void switch_press(void)
  234. {
  235.         if(TB0CCTL2&CCIFG )
  236.         {


  237.                         if(TB0CCTL2&CCI) //if input is high,
  238.                         {
  239.                                 if(((TB0CTL&MC0)||(TB0CTL&MC1))) //timer must berunning for a valid count
  240.                                 {

  241.                                                                 if(TB0CCR2>MIN_SHORT_COUNT)//debounce

  242.                                                                         {
  243.                                                                                 if(TB0CCR2< SHORT_PRESS_COUNT)                        //read the timer value to be fare short or long press , very long press is taken care by timer over flow interrupt

  244.                                                                                 {
  245.                                                                                         system.key_event=KEY_EVENT_SHORT;
  246.                                                                         //                P2OUT ^= BIT4; debug
  247.                                                                                         //genrate short press event
  248.                                                                                 }else
  249.                                                                                 {
  250.                                                                                         system.key_event=KEY_EVENT_LONG;
  251.                                                                                 //        P2OUT ^= BIT5; debug
  252.                                                                                         //long press event
  253.                                                                                 }
  254.                                                                 } //debounce end
  255.                                         TB0CTL&=~(MC0|MC1);
  256.                                 }//timer running end
  257.                         }else //if input high end
  258.                         {
  259.                                         TB0CCR2=0;
  260.                                         TB0CTL|=MC_2;
  261.                                         TB0CTL |= TBCLR; //it clears auto

  262.                         }


  263.         TB0CCTL2 &= ~(CCIFG|COV);

  264.         }

  265.         if((TB0CTL&TBIFG)) //if over flow occur then it has been very long press
  266.         {

  267.                 if(!(TB0CCTL2&CCI)) //if input is low,
  268.                 {
  269.                 system.key_event=KEY_EVENT_VLONG;
  270.                 }
  271.                 //genrate very long press event
  272.                 TB0CTL&=~(MC0|MC1);

  273.                 TB0CTL &= ~TBIFG;

  274.                 // P1OUT ^= BIT4; debug
  275.         }


  276. }


  277. update_IO()
  278. {
  279.         if(system.output_on && !system.ischarging && system.battery_level!=EMPTY)
  280.         {
  281.                 // system output on
  282.                 //start led timer
  283.                 P3OUT |= BIT4;
  284.                 setPWMA0(system.brightness);
  285.         if(system.ison&BIT0)
  286.                 {
  287.                         setPWMA1(system.brightness);
  288.                 }else
  289.                 {
  290.                         setPWMA1(0);
  291.                 }
  292.         if(system.ison&BIT1)
  293.                 {
  294.                         setPWMB2(system.brightness);
  295.                 }else
  296.                 {
  297.                         setPWMB2(0);
  298.                 }
  299.         }
  300.         else
  301.         {
  302.                 //stop led timer heir
  303.                 //goto sleep if you want
  304.         P3OUT &= ~BIT4;
  305.         setPWMA0(0);
  306.         setPWMA1(0);
  307.         setPWMB2(0);
  308.         system.output_on=0;

  309.         }

  310. }


  311. int main(void) {
  312.         volatile unsigned int i=0;
  313.         system.ison=0x7;
  314.         system.brightness=10;
  315.         system.output_on =0;
  316.     WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
  317.     P2DIR |= BIT4|BIT5|BIT6; //led 1 2 3
  318.     P1DIR |= BIT4; //led4
  319.     P3DIR |=BIT4; //system load BIT5 STAT1 BIT6 STAT2

  320.     P1DIR &=~BIT5;
  321.     P1REN |= BIT5; //Switch
  322.     P1OUT |= BIT5;
  323.     P1SEL0 |= BIT5;
  324.     P1SEL1 &= ~BIT5;

  325.         initClock();
  326.         initCCPB0();
  327.         initADC();
  328.         initLEDTIMERB1();
  329.         P1SEL1 |= BIT6 | BIT7; //SDA SCK
  330.         P1SEL1 |= BIT6 | BIT7;
  331.         EUSCI_B_I2C_masterInit(EUSCI_B_I2C_CLOCKSOURCE_SMCLK ,8000000 ,EUSCI_B_I2C_SET_DATA_RATE_100KBPS ,0,EUSCI_B_I2C_NO_AUTO_STOP );
  332.         EUSCI_B_I2C_setSlaveAddress(DPOT_I2C_ADDRESS);
  333.         EUSCI_B_I2C_setMode (EUSCI_B_I2C_TRANSMIT_MODE);
  334.         EUSCI_B_I2C_enable ();
  335.         EUSCI_B_I2C_masterMultiByteSendStart(0x10);
  336. //        EUSCI_B_I2C_masterMultiByteSendNext();
  337.         EUSCI_B_I2C_masterMultiByteSendFinish(0x40);

  338.         EUSCI_B_I2C_masterMultiByteSendStart(0x0);
  339. //        EUSCI_B_I2C_masterMultiByteSendNext();
  340.         EUSCI_B_I2C_masterMultiByteSendFinish(0xD8);
  341.         initPWMA0();
  342.         initPWMA1();
  343.         initPWMB2();
  344.         setPWMA1(0);
  345.         setPWMA0(0);
  346.         setPWMB2(0);
  347.     __enable_interrupt();

  348.          while(1)
  349.     {
  350.                         switch(system.key_event)
  351.                         {
  352.                         case KEY_EVENT_SHORT:
  353.                                 system.output_on=!system.output_on;
  354.                                 break;
  355.                         case KEY_EVENT_LONG:


  356.                                 if(system.brightness==MIN_BRIGHTNESS)
  357.                                 {
  358.                                 system.brightness= system.brightness+BRIGHTNESS_FIRST_STEP;
  359.                                 }else{
  360.                                 system.brightness= system.brightness+BRIGHTNESS_STEP;
  361.                                 }
  362.                                 if((system.brightness)==(MAX_BRIGHTNESS+BRIGHTNESS_STEP))
  363.                                 {
  364.                                         system.brightness= MIN_BRIGHTNESS;
  365.                                 }
  366.                                 else if(system.brightness>MAX_BRIGHTNESS)
  367.                                 {
  368.                                         system.brightness= MAX_BRIGHTNESS;
  369.                                 }

  370.                                 break;
  371.                         case KEY_EVENT_VLONG:
  372.                                 system.ison= system.ison<<1;
  373.                                 if(system.ison==0)
  374.                                 system.ison=0x7;
  375.                                 break;
  376.                         case KEY_EVENT_NONE:
  377.                                 break;
  378.                         }

  379.                         if(system.key_event!=KEY_EVENT_NONE || calcBatLevel() )
  380.                         {
  381.                         update_IO();
  382.                         system.key_event=KEY_EVENT_NONE;

  383.                         }


  384.                 //                 EUSCI_B_I2C_masterMultiByteSendStart(0x0);
  385.                 //        EUSCI_B_I2C_masterMultiByteSendNext();
  386.                 //        EUSCI_B_I2C_masterMultiByteSendFinish(i++);


  387.     }
  388. }

复制代码
0.png

Altium Designer画的LT3478 大功率led驱动器原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

所有资料51hei提供下载:
Solar_LED_MPPT_Charger-master_.zip (6.74 MB, 下载次数: 627)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:440014 发表于 2018-12-5 14:08 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:264734 发表于 2019-3-12 13:31 | 显示全部楼层
正在学习这个IC,收藏了,谢谢
回复

使用道具 举报

ID:448776 发表于 2019-3-30 11:40 | 显示全部楼层
正需要 谢谢
回复

使用道具 举报

ID:294886 发表于 2019-4-9 15:30 | 显示全部楼层
谢谢分享,最近在搞bq25895,焦头烂额!
回复

使用道具 举报

ID:528684 发表于 2019-5-7 09:12 | 显示全部楼层
能把封装库一起打包发出来嘛
回复

使用道具 举报

ID:475858 发表于 2019-6-11 09:15 | 显示全部楼层
已经下载,挺不错的
回复

使用道具 举报

ID:563095 发表于 2019-6-15 15:48 | 显示全部楼层
谢谢楼主,正需要
回复

使用道具 举报

ID:111376 发表于 2019-7-20 08:45 | 显示全部楼层
好资料,谢谢楼主
回复

使用道具 举报

ID:275042 发表于 2019-8-1 16:08 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:71262 发表于 2019-9-7 08:46 | 显示全部楼层
正需要 谢谢
回复

使用道具 举报

ID:617016 发表于 2019-9-27 09:25 | 显示全部楼层
好资料,参考一下!
回复

使用道具 举报

ID:286311 发表于 2019-11-6 10:21 | 显示全部楼层
这个资料很好,楼主大好人呀
回复

使用道具 举报

ID:68194 发表于 2019-12-9 14:14 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:683703 发表于 2020-1-8 17:07 | 显示全部楼层
不知道这个充电电路支持多大的充电电流,
回复

使用道具 举报

ID:683703 发表于 2020-1-8 17:08 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:688742 发表于 2020-2-1 17:28 | 显示全部楼层
不错,就是硬件有点
回复

使用道具 举报

ID:720398 发表于 2020-4-1 17:58 | 显示全部楼层
这个是印度佬写的工程
回复

使用道具 举报

ID:477524 发表于 2020-4-18 21:52 | 显示全部楼层
好资料,参考一下!
回复

使用道具 举报

ID:297778 发表于 2020-10-20 09:15 | 显示全部楼层
好资料,楼主是个牛人
回复

使用道具 举报

ID:4021 发表于 2020-11-21 22:44 | 显示全部楼层
没明白最后装出来是什么样子 ?有显示吗 ,外面接的是什么?水平低看不懂
回复

使用道具 举报

ID:137526 发表于 2021-9-15 23:57 | 显示全部楼层

正在学习这个IC,收藏了,谢谢
回复

使用道具 举报

ID:899981 发表于 2021-12-30 14:43 | 显示全部楼层
能简单说一下控制原理吗?尤其是BQ24650这个芯片,学习一下。
回复

使用道具 举报

ID:946657 发表于 2022-1-18 14:00 来自手机 | 显示全部楼层
ZHAOBAO511 发表于 2021-12-30 14:43
能简单说一下控制原理吗?尤其是BQ24650这个芯片,学习一下。

可以互相探讨一下吗
回复

使用道具 举报

ID:1009425 发表于 2022-10-5 20:29 | 显示全部楼层
这个板子费钻头,不知道那么多过孔干嘛的
回复

使用道具 举报

ID:554177 发表于 2022-10-5 23:40 | 显示全部楼层
好,收藏待用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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