Browse Source

Ugh, avr registers.

master
Your Name 4 years ago
parent
commit
0a3bb1c21f
4 changed files with 363 additions and 0 deletions
  1. BIN
      FlammableGasSensor/docs/.3.tex.swp
  2. +70
    -0
      batterycharge_stationdata/arduino/batterycharge_stationdata/batterycharge_stationdata.ino
  3. BIN
      batterycharge_stationdata/datasheets/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
  4. +293
    -0
      batterycharge_stationdata/docs/7.tex

BIN
FlammableGasSensor/docs/.3.tex.swp View File


+ 70
- 0
batterycharge_stationdata/arduino/batterycharge_stationdata/batterycharge_stationdata.ino View File

@ -0,0 +1,70 @@
/*
DigitalReadSerial
Reads a digital input on pin 2, prints the result to the serial monitor
This example code is in the public domain.
*/
int ADC_VAL0 = A0;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the ADC_VAL0's pin an input:
//pinMode(ADC_VAL0, INPUT);
analogReference(INTERNAL);
//to find where arduino does this, grep -r analogReference in Arduino install folder
//cryptic shit though
//so instead, just fprint the register before and after the change. much more intuitive.
//do it manually...
//this doesn't work
//ADMUX = (0 << REFS1) | (0 << REFS0) ;
//this doesn't work
//ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX0);
//this doesn't work
//ADMUX = ADMUX | 0b11001110;
//this doesn't work
//ADMUX = (1 << REFS1) | (1 << REFS0) ;
//this also doesn't work
//ADMUX |= (1 << REFS0);
//ADMUX |= (1 << REFS1);
//search engines have been fucked over with endless forum debates, hopeless. a blog post guide would suffice.
//even this doesn't work. why... it should work. must be wiring code breaking things. give up for now.
//ADMUX = ADMUX | 0b11000000;
}
// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int ADCVAL0_State = analogRead(ADC_VAL0);
// print out the state of the button:
Serial.println(ADCVAL0_State);
delay(10000); // delay in between reads for stability
//Trying to debug why I cant change a bit in a register. fucking wiring. fuck search engines.
//int dog = ADMUX;
//Serial.println(ADMUX,BIN);
}

BIN
batterycharge_stationdata/datasheets/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf View File


+ 293
- 0
batterycharge_stationdata/docs/7.tex View File

@ -0,0 +1,293 @@
\documentclass[11pt]{article}
%Gummi|065|=)
\usepackage{graphicx}
\usepackage{caption}
\title{\textbf{BatteryMonitorBoard}}
\author{Steak Electronics}
\date{}
\begin{document}
\maketitle
\tableofcontents
\section{Overview}
\section{Chip Hunting}
Need to find a chip for battery charging. Some sheets have been saved. I looked at TI primarily. Though considered one AD/LTC. BQ2954 is out of the question as its too complex in its application circuit. THe BQ2000 is a 8 pin DIP and seems like a good start. That will cover nicad/nimh, and lithium batteries.
Though the BQ2000 is a bit of a mess as well. Data sheet has a complex circuit. There is a simpler one here:
http://www.ti.com/lit/pdf/sluu007
and
https://electronics.stackexchange.com/questions/95970/how-to-use-battery-charge-controller-bq2002n
Regardless of the contents of that post, the fact is, the chip requires a lot of stuff.
https://www.st.com/content/ccc/resource/technical/document/datasheet/df/b9/e6/5b/ec/92/45/ed/CD00132951.pdf/files/CD00132951.pdf/jcr:content/translations/en.CD00132951.pdf
This chip: stc4054, is extremely simple. Limited to 1 lithium cell (so only 4.2 volts max) but application circuit is lean, and it has a shutdown pin, so you can turn off the charger. Price is the cheapest as well, at 1.50 for 1.
That looks hopeful. Why not multiple?
Need to remember to be careful of 4.1 lithium batteries. Most chargers are 4.2, and its easy to forget that there is a difference.
MCP73826 is another reasonable option. Slightly more complex, but not by much.
RT9526A is also simple. Let's start with the st chip.
Looks like the voltage on that pin should be between 1.2 and 2.4 in order to turn it off. Below 1.2 it is on, and monitoring current. Above 1.2 but below 2.4 it is off. above 2.4 it's putting 35ua into the battery. I think.
Also like the LTC1734, which is lithium / nicad. But expensive at 3-4 dollars. Don't see any lead acid battery chargers on digi that aren't being obsoleted. There's not one. I did see some on manufacturer's pages though. Just not here.
There is one microchip one (lead acid) based on a pic. App circuit is complex.
AN1015 is the app note.
So need a lead, and nicd charger still.
Tomorrow I'd like to look at maxim. I see this:
https://www.maximintegrated.com/en/products/power/battery-management/MAX1772.html
But the application circuit is too much for what I want to deal with.
Seems lead acid battery chargers are not as common as they must've been before.
Onsemi is only lithium batteries.
Mouser has only universal chargers, no lead. But universal includes lead.
let's check linear. LT1510 is an 8 pin simple device. Though it's nicad and lithium only. It says it can do lead in table, but not in datasheet.
lt1510 would work for nicad. data sheet figure 6 has a circuit for nicad.
What about lead?
lt1513 does the three main types: nicd,li-ion,lead
At a cost of \$10.
At digi, the bq2031 is the only lead battery chip (not multi type) that is in production. Not much choice. EDIT: actually that is not
recommended for new designs either.
http://www.eevblog.com/forum/beginners/mc34063-battery-charger/msg1378671/\#msg1378671
Here he uses a boost regulator to power a battery. Essentially just setting the voltage.
http://www.eevblog.com/forum/projects/switching-lead-acid-battery-charger-ic/msg806972/\#msg806972
Here is some better advice.
quote:
\begin{verbatim}
I'd recommend just float charging. It takes only a little longer
and is easier on the batteries. You will need to limit the initial
charge current to about 0.1 C (so 2 A for a 20 AH battery). The
easiest way to do this is a constant current/ constant voltage
power supply. Set the current limit to the desired charge current,
and the voltage to the float voltage (13.8 V adjusted for
temperature if needed). The voltage on the battery will slowly
increase over time until it reaches ~13.8 V, then the current will
slowly drop over time until it reaches nearly zero. At that point,
the battery is fully charged and you can either remove the charger
or just leave it on.
\end{verbatim}
Which is what I did with my solar battery charger, and it worked well. So I suppose there is no need for anything more than a vreg for lead batteries. This time I will go to the recommended 13.8 instead of what I had before (around 12) and I will do the same trickle charge method. Simple. Done.
May use 1512 instead. \$5 in 150 quantity. Hm...
\$10 in single.
That would cover lead, nicad.
Will need jumpers on R1 and R2 depending on what battery type. According to data sheet, li-ion the divider is a float voltage. In nicd, it is a top limit.
OK, i've decided:
\subsection{Part Selection Summary}
LT1512, and STC4054.
For starters, I will use stc as lithium and lt as nicad / lead.
this will avoid the worry of jumpers, and what not. Later I can be flexible.
Now onto other parts. I need some way to monitor the current, and of course a voltage tap.
Where to put current sense? I think before the battery.
I should put some jumpers in, so I can isolate everything though. I dont' want to mix circuits at the start. So isolate the charger from the op amp and sense, at first.
Let's go with the basic differential op amp in microchip an1332. I need a vreg supply (linear) at 15.5 volts, for the op amp, so it's above the lead battery voltage. Simplest two switchers I see are lm2577 or the mk3608. The mk is easier to use.
With that we have:
\begin{itemize}
\item Battery charger x 2
\item voltage monitor x 2
\item current monitor x 2
\item ethernet (using off the shelf enc modules for now, but maybe
on board later).
\item microcontroller (nano)
\item temperature monitor (something like max6675 looks nice. can put on board, without difficulty).
\item additional taps into adc, and some op amps and current shunts not populated to be used as extra current - voltage converters. At least two. Put on modular schematic.
\end{itemize}
I also want a general current and voltage monitor. I want
to be able to watch the load on a battery, and record that as well...
Perhaps that will be separate. I might want to grab some off the shelf
current / voltage monitoring stuff, or just throw a few op amps with breakouts on the board.
Let's build.
Keep all schematics modular!
\textbf{A note on lt1512 tuning}
\begin{verbatim}
How this is tuned:
The V divider on Feedback pin
determines float voltage.
The R downstream of I_feedback
(after 24 ohm resistor)
determines current (100mV / R)
See data sheet for more details.
Put Simply: Set float voltage on r divider
and make sure current resistor is high enough
to be low current.
\end{verbatim}
\textbf{Calculating LT1512 vdivider}
\begin{verbatim}
Example calculation for R1:
R1 = (R2(Vbat - 1.245) )\ (1.245+R2(0.3uA))
with default R2 at 12,400
Desired Vbat float of 13.8 (lead)
(13.8 - 1.245) * 12400 == 155682
1.245 + (12400 * .000003) == .03720 + 1.245 == 1.2822
155682/1.2822 == 121417
It would be evil for them to put 0.3uA and
expect you to convert that to 0.000003A
But that's what they did. At least they
give an example to check.
Five zeros on that.
\end{verbatim}
Based on the vdivider, what you are seeing is for high voltages, with R2 being the recommended 12.4K, is R1 150K at ~13, R1 220K at ~9V.
Some more notes
\begin{verbatim}
checking the given example:
41200 * (8.2 - 1.245) 286546
41200 * 0.000003 + 1.245 == 1.3605
lowest possible value (1.3V charge)
(1.3 - 1.245 ) * 12400 == 682
(12400 * .000003 ) + 1.245 == 1.28
682 / 1.28 == 532
so lowest resistor value must be 500 about...
\end{verbatim}
Lowest resistor would be 536. (e48 resistor)
\subsection{Current monitor}
I considered doing an (high side) op amp with external resistors per AN1322 microchip app note, but decided to go instead with a current monitor, ala ina169. There are a number of INA chips being advertised. Adafruit, for example sells the INA219 and there are many articles
about other current sense in the same family. There is the shunt
resistor value, and the gain resistor to set. I will use based off of the adafruit example, as well as the ti example a 1ohm shunt (for up to 1A readings, seems as you decrease the shunt you get more capacity in amperage to read), with a 1K gain resistor, which TI gives as an example in a table. That means voltage will equal current.
For the inductor
see lt data sheet for details.
must not be series resistance greater than 0.1 ohms.
\subsection{PCB Revision - Modular Parts}
I decided to route out some of the pcb, so I can possibly reuse the temperature sensor and perhaps the lithium battery charger. This was on revision 2. I got the first revision already made after a marathon one Sunday morning from 8-2pm. Here's how it is routed out.
\includegraphics{../pics/modular_reusable.jpg}
\captionof{figure}{Cut out with pliers and reuse parts.}
\subsubsection{Ripped off by temperature sensors}
The community around Arduino advertises the LM35, advertises the MAX6675. The latter is \$10 in one off quantity (\$5 from ebay), the former isn't cheap either, at \$2.00 about. Though the LM35 has a much more limited range. The LM35 is great as it's extremely simple to use (power and read voltage which converts directly to temperature).
I'll have to find an alternative for the MAX6675. At \$10 it's just stupid. A micro can do temperature as well. Maybe \$5 would be acceptable, but \$10 is not. How big are your pockets?
\vspace{0.4in}
\includegraphics[scale=0.3]{../pics/tinythermocouple.jpg}
\captionof{figure}{technoblogy has an article on using a micro with an external thermocouple}
Cheapest thermocouple on Digikey, is a digilent (they just import) thermocouple at \$10. Next is a DFRobot (chinese adafruit) at \$30 with a module included. Thermocouples are not cheap! Onto ebay.\footnote{Thermocouples: I forgot how they work today. I've read of them before but haven't used them much (have seen them in toasters. Now that I know they are worth \$5-10 I'm going to start retrieving them from broken toasters). When two dissimilar metals are put together, and then the metals are heated, you can get a voltage across them. This voltage can be read with an ADC. This phenomenon has a name, but the name is not important. Names just add another thing you need to remember. Bad idea. (OK, I remembered it, now I can fool myself into feeling intelligent - seebeck effect. Now let me go count my hertz, and volts, and teslas...) Wikipedia calls it the thermoelectric effect.}
After some research I decided to go with the Digilent probe. The cheapest used probe on ebay is \$10. I don't want the new ones from US, which is only \$5 cheaper.
\section{Bom Notes}
I should try to get rid of some expensive items where possible.
\vspace{0.2in}
tantalum is \$1. Try a ceramic.
MAX6675 is \$10.
Slide pot is just for fun. That can be removed.
\vspace{0.2in}
On the subject of boms, I have made two. The LT portion is complex, and requires its own bom. The rest of the items are on a different bom. I keep some things in stock so a few items have been omitted.
\subsection{SOD323 (diode) is equal to 0805}
Looks like the SOD323, diode / SC-73 package is near the 0805 package in size. SOD323 is slightly smaller, but not by much. They are probably interchangeable in practice.
\section{PCB Build and Test Notes}
I built the PCB. There were a few errors which I've put in the TODO file, but nothing show stopping. There will be a rev2 pcb. A few notes:
On the LT1512, if you float the voltage divider, and Feedback pin, the device will short out. My power supply continually is saving me on this.
For the voltage divider, you don't actually see the float voltage, between R1, and R2 of the divider, I don't think. The voltage, however does rise, above the divider, where the Vsw pin is. What you do see is the 1.24 reference, or some voltage near it.
What I'm seeing now, is if you connect a scope probe to the lt charge pin, (pin which charges the battery) you can adjust the divider and see the voltage rise. That must be the float voltage. Meanwhile, the feedback pin, which is downstream of the charge pin, has always about 1.24 or so.
So seems to work well. For a while, I misunderstood how the voltage divider was supposed to work, and spent a few hours double checking the divider values. I had wired the switches wrong in rev 1, but that was not the issue. The issue was my expectation to see the voltage between the divider actually be the float voltage, when that float voltage was above the divider. Must be some transistor math doing a calculation on the voltage divider.
With the 0.2 ohm resistor (in typical application first page of LT1512 data sheet), I had changed it to a 1ohm. That was still not enough, and I instead substituted in a 10ohm. This limits charging to 10mA. The 1 ohm resistor seemed to have some issue of high float voltages causing thermal runway... Maybe a 5 ohm resistor can be used for 20mA charging. This was only on high float voltages. With the 1 Nicd, I was able to do 80-100mA of charging, without issue. But once float is around 5-6 volts you start to get issues with the current growing exponentially from the main PSU, and the LT1512 chip overheating. (At \$8 each, a melted chip is to be avoided).
\subsection{Current usage, and Solar Project}
This project is a descendant of the solar battery charger project. I'm going to restart that project with some of these components, but might use the LT1372, or some other more efficient regulator. No current limiting should be necessary, given that I will use small solar panels (though current limit, might need to be in consideration).
The INA169 draws about 90uA when measuring the 10mA of current going through for a 6V lead battery.
\subsection{Current Limiting resistor on LT1512}
The Resistor after I Feedback, R10 (in my schematic. it's the 0.2 ohm resistor in the official data sheet)... In the circuit here, it is 1 ohm. It
will allow about 80mA into a NiCd at 1.2
volts. At this level, there is an issue with
charging voltages above single cell lithium values. What happens
is that the circuit starts using over an amp of current and
the LT chip overheats.
If you increase the resistance, you
can lower the current output and thus also charge 6-12v
batteries.
Test with a current limiting power supply!
\subsection{Separate Grounds 1512}
I did not separate the grounds on the first run, and while there might be more noise (I didn't measure) everything seems to work, regardless.
\subsection{Switches Max Current}
These switches have a max current of 300mA.
\subsection{Usage}
Here's how to use this device. Plug in a 9-12V PSU. Connect USB to computer (bbb, rpi preferred for long term usage).
Measure the voltage divider. This value is found after the large diode, but before the voltage divider. Adjust the switches, and pot as needed. Check with a DMM, for the voltage - that will be the final charge voltage.
Connect battery + into INA169 (high side current sense) . Connect INA169 v out into LT CONN (which is same as where float voltage is measured).
Connect battery - into ground. Check ina169 ADC reading with Serial out or DMM, it should reflect the charging. You can also put a DMM in series with battery to confirm its charging.
\end{document}

Loading…
Cancel
Save