![]() |
| Green trace: voltage across ceramic capacitor before the ferrite bead Red trace: voltage across tantalum capacitor after the ferrite bead |
Make something that works by designing it right. A DIY hardware page on analog/power supply/digital circuits, microcontrollers.
Search This Blog
Tuesday, December 19, 2023
Isolated power supply 2
Sunday, April 30, 2023
USB Power Bank
I got one of those Leed's USB power bank from my apartment building during a planned power outage. It blew up when I tried to charge it. There wasn't a whole lot I could reverse engineered from the dead parts. There was a 5-pin and a 6-pin chips and a bunch of passives. My understanding is that it uses an inverting buck boost converter for both charging and output as the VUSB pins of both the USB connectors are connected together.
I finally got around to rebuild it from scratch this weekend with what I have on hand. The parts I have were from aliexpress before the big chips shortages. I use a LTC4054 Li-ion charger chip and a MT3608 boost converter.
The charging rate is limited by heat dissipation on a tiny single sided PCB. The output current is limited by the Schottky diode, inductor and battery discharge rate to about 1A (or slightly higher) or so matching to the original power bank.
| Populated PCB (I only have 1A/20V Schottky diode.) |
| Modified connector to sense presence of USB plug |
| Red LED = Charging |
| Green LED = Operating. Brightness proportional to load |
Yellow is when both are connected, but that doesn't usually happen as the connector spacing is too closed together.
Tuesday, February 14, 2023
STM8 - Generating 2 phase PWM
A push pull converter uses two drivers that are 180 degrees out of phase.
It is possible to generate PWM on 2 channels that are 180 degrees out of phase in TIM1on a STM8S003. All the register settings are from the reference manual, but you won't find an example.
TIM1 is set up as an up/down counter in Center-aligned mode. This spaces out the 2 phase PWM signal evenly.
Since the timer is counting both up and down in 1 PWM cycle, auto-reload value for TIM1 should be set as 1/2 of the value to generate PWM frequency. I used TIM1_FREQ of 27kHz in my code.
#define CPU_CLOCK 16000000UL
#define TIM1_FREQ 27000L
#define TIM1_PSCR 1
#define TIM1_CLK (CPU_CLOCK/TIM1_PSCR)
#define TIM1_ARR (TIM1_CLK/TIM1_FREQ/2)
#define TIM1_PSCRH ((TIM1_PSCR-1)>>8)
#define TIM1_PSCRL ((TIM1_PSCR-1)&0xff)
#define TIM1_ARRH ((TIM1_ARR)>>8)
#define TIM1_ARRL ((TIM1_ARR)&0xff)
// Clk = 16MHz
CLK->CKDIVR = 0;
TIM1->PSCRH = TIM1_PSCRH;
TIM1->PSCRL = TIM1_PSCRL;
TIM1->ARRH = TIM1_ARRH;
TIM1->ARRL = TIM1_ARRL;
// TIM1 enable, Center-aligned mode 3
TIM1->CR1 = TIM1_CR1_CEN|TIM1_CR1_CMS;
Output enable (and polarity) bits of the corresponding TIM1 channels can be set in TIM1 CCERx. I use CH3 and CH4.
// CH3, CH4 output enable, polarity active high
TIM1->CCER2 = TIM1_CCER2_CC4E|TIM1_CCER2_CC3E;
From the Reference Manual:
110: PWM mode 1 - In up-counting, channel 1 is active as long as TIM1_CNT < TIM1_CCR1, otherwise, the channel is inactive. In down-counting, channel 1 is inactive (OC1REF = 0) as long as TIM1_CNT > TIM1_CCR1, otherwise, the channel is active (OC1REF = 1).
111: PWM mode 2 - In up-counting, channel 1 is inactive as long as TIM1_CNT < TIM1_CCR1, otherwise, the channel is active. In down-counting, channel 1 is active as long as TIM1_CNT > TIM1_CCR1, otherwise, the channel is inactive.
One can generate a PWM signal using a sawtooth wave and a comparator.
PWM generation using analog circuit - Sawtooth wave and a comparator
The modulating signal level is the CCR value, the TIM1 counter is the sawtooth wave. The PWM modes 1 and 2 are just the polarity setting on the comparator.
One of the TIM1 channel (CH3) is set up with PWM Mode 1 while another channel (Ch4) as PWM Mode 2.
// CH3: PWM mode 1, preload, output
TIM1->CCMR3 = (6<<4)|TIM1_CCMR_OCxPE;
// CH4: PWM mode 2, preload, output
TIM1->CCMR4 = (7<<4)|TIM1_CCMR_OCxPE;
Use PWM Mode 1 for one of the channels to center an output around Timer count = 0 and Mode 2 on the other to center around Timer count = ARR. This is how you can generate the 2 phase PWM signals.
The CCR values could be set independently. In some applications, you want them to have the same PWM duty cycles. The granularity of the PWM signal is 2 TIM1 clocks. (125ns in my code)
void Set_PWM(uint16_t Value)
{
Value >>=1;
// CCR3 = n/2
TIM1->CCR3H = Value >>8;
TIM1->CCR3L = Value & 0xff;
// CCR4 = TIM1_ARR - n/2
Value = TIM1_ARR - Value;
TIM1->CCR4H = Value >>8;
TIM1->CCR4L = Value & 0xff;
}
Turn on the MOE (Main Output Enable) bit in TIM1 BKR (Break Register). An external signal can be used to disable the TIM1 outputs in the case of a hardware fault. e.g. over-current or over-temperature condition
// Master output enable
TIM1->BKR = TIM1_BKR_MOE;
This are some the output of PWM waveform at 27kHz captured on my logic analyzer.
Sunday, February 12, 2023
Optocouplers
Optocouplers are some of those things that are deceivingly easy to a beginner, but also hard to use correctly. If you are reading the datasheet carefully, you are in for a big surprise.
CTR (Current Transfer Ratio): sensitivity of the coupler - the ratio of the transistor output current vs the LED current. e.g. for a 50% CTR, you have to drive the LED with 10mA and the transistor switches 5mA.
The CTR spec is very loose and likely this series of optocouplers are just different bins of the same parts. They don't even include a max value.
This ones show both min and max value from 100% to 200%. The following shows the part to part variation of a for a small samples of a (different) optocoupler.
Analog feedback
The optocoupler is commonly used as an analog feedback in an isolated power supply. The error voltage is pass back as a current sink or source to close a negative feedback loop of a regulator across a voltage barrier.
I played around with the isolated power supply design from previous blog with feedback from the secondary side. The voltage regulation is very tight and virtually stays at around 5V from 5mA to125mA load.
I have no idea on how well it would work with the loose CTR specs.
Passing digital signals
Simple coupler circuit (green)
The middle circuit (blue)
The more complex circuit (Red)
Friday, February 10, 2023
Isolated power supply
First attempt
After seeing the voltage feedback circuit from my last post, I am trying out some ideas of using that for an isolated power supply. Here is what I have using LTSpice simulation.
It is an unregulated isolated power supply from 12V to around 5-6V. There are 3 windings for the transformer on a ferrite.
L1 is feedback path for the oscillator. R4 is used to limit the amount of feedback. L1 is also used as a negative feedback for the voltage across the winding.. The negative peak voltage across the winding is rectified across C4. When the voltage high enough, the 4.5V Zener diode D3 conducts and clamps the base of Q1.
As can be seen from the traces below, the voltage across C4 does not reflect on the output voltage. It regulate the peak voltage of the winding. The voltage regulation of this circuit is about as bad as those old transformer wall warts. The voltage output is about 6.6V at 5mA load and drops down to 5V at 50mA.
The regulation can probably be improved with a bit of components tweaking. A linear LDO regulator at the output can be used for tightening the regulation.
L2 is the primary winding for the flyback converter. I limit the inductor current with the help of Q2 and R3. Small inductor value and high supply voltage results in high di/dt. Some of these energy ends up as high voltage spikes at self resonant frequency of component parasitic.
L3 is the secondary winding for the flyback circuit. I use a ferrite bead to filter the switching noise.
I use a RCD snubber in the circuit. It merely clamps the collector voltage of Q1 (rated for VCE = 40V) to a safe value. A RC snubber could eliminate the ringing by dumpling the excessive energy. It is something to think about for EMI reasons.



































