FunctionGen

From NebarnixWiki
Revision as of 19:28, 3 September 2015 by NebarnixWikiSysop (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Problem Statement

Function generators are expensive. Since I moved away from the university, I can no longer pillage the senior design lab for design tools, and I'd like to have a variable frequency / duty cycle mosfet driver for designing power converters with. All I need is a square wave, and with enough current capability to be able to drive a power MOSFET directly. Since its a piece of test equiptment, it doesn't make sense to make it battery powered so I would like to use some of the small transformers in the junk box and build a switching regulator to bring the voltage down to a reasonable and adjustable drive level.


Design

I used a left-over MSP430F1132 chip with a 4Mhz crystal. 10-bit ADC inputs sample two trim pots for frequency and duty cycle. These are converted from the 0-1023 range to a clock divider for the 16-bit Timer_A via the following equation, which is designed to give a logrithmic control over the entire frequency range of 2Mhz - 61Hz with only a single knob. An LCD display was added to show the current freq / duty cycle setting and a button to enable a fine tuning mode as well as a 'locked' mode.

The following M-code shows the process:

freq = 4e6; %clock frequency
div_max = 65535; %not currently used in the calculations
fdial = 0:1:1023; %input range of the frequency trimpot

%freq_desired = (freq/2).*(10.^(fdial./226.5)./(10^(1023/226.5))); %226.5 results in a 65535 end point
%divisor_modeled = freq ./ freq_desired;
%When simplified becomes...
divisor_modeled = 2.*(1.010226.^(1023+fdial));
divisor_modeled = uint16(divisor_modeled);

subplot(2,1,1);
stairs(fdial, freq ./ uint32(divisor_modeled));
set(gca, 'YScale', 'log')
axis ([0 1023 0 freq]);
subplot(2,1,2);
stairs(fdial, uint32(divisor_modeled));
set(gca, 'YScale', 'log')
axis ([0 1023 0 65535]);

MSP430 Source Code

Can be found here (For reference only, all rights reserved)

Results

2011: added an LCD and a set button. This won't work for HV supplies, but works well for reasonable prototyping.

"Meh. Definitely need a 'set' button. With the log scaling function, noise is amplified and can result in quite a bit of "wandering" of the frequency and duty cycle. A set button could cycle between "Course", "Fine", and "Locked-In" modes. Seems kinda ghetto and doesn't even work for flybacks, which seem to reboot the MSP430. Better solution is to move towards a TL494 based solution. "

2010 Jasper Nance KE7PHI