Arizona Chris
Joined: 20 Dec 2014 Posts: 69 Location: Arizona
|
3W RGB flashlight project |
Posted: Sat Oct 08, 2016 3:21 pm |
|
|
How bout that, a project that has nothing to do with robotics. ;) This started when I found I had three 12F675 processors left in my drawers, and I had to design a project to use them up. I now use a modern new 8 pin device, and the old reliable '675 proved its worth again on this.
What this does is you vary the voltage on a potentiometer output from 0-5v into the analog input, A0. Then generate a PWM at a 1khz period from zero (fastest is actually around 20uS) to 100% on. Three of these are on the PCB, and control one leg of a 3W RGB led.
This was a real fun project! and I cant tell you how cool it is to go out in the dark at night with this thing and blast various colors out and about with the brightness of a supernova.
Before I post the code for one '675 at the end, please see the write up for more complete information:
The entire project write up can be found here:
This project was a lot of fun, and in the dark outside at night is a blast! 3W does not sound like much light, but it is as if the sun rose and was in your hand. It was very interesting to illuminate various plants and rocks with the different colors and see how the appearance greatly changed. Its like a whole nother universe of seeing the world has opened up for me. Here is the write up:
http://www.schursastrophotography.com/PICprojects/RGBflashlight.html
All our PIC projects coded in CCS-C can be found here by the way:
http://www.schursastrophotography.com/PICCmain.html
Thanks for looking!
Code: |
//****************************************************************************
//Chris Schur
//Project Name here: 12F675 NO xtal LED PWM
//Date: 9/23/16
//****************************************************************************
/*Description of this Program: This program Will use the 100k pot and vary the
PWM out put from near zero on time to near 100% on time at a pulse period of
1ms. Works great!*/
//I/O Designations ---------------------------------------------------
// A0 (GPIO0): An0 = Potentiometer Input
// A1 (GPIO1): X (An1)
// A2 (GPIO2): Digital Output to LED
// A3 (GPIO3): X (can ONLY be input)
// A4 (GPIO4): X (An3)
// A5 (GPIO5): X
//--------------------------------------------------------------------
//Include Files:
#include <12F675.h> //Normally chip, math, etc. used is here.
//Directives and Defines:
#device ADC=10 //This directive will only work if put RIGHT HERE first...
#fuses NOPROTECT,NOMCLR
#use delay(internal=4MHz)
#use fast_io(A)
//****************************************************************************
//-- Main Program
//****************************************************************************
void main(void) {
// Set TRIS I/O directions, define analog inputs, comparators:
set_tris_A(0b101001); //sets port directions
//(analog inputs digital by default)
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_DIV_2);
set_adc_channel(0);
//Initialize variables and Outputs: --------------------------------------
int16 result; //0 - 1023 out of ADC
int16 on_pulse; //LED high pulse width in uS
int16 off_pulse;
//----------------------------------------------------------------
//MAIN LOOP:
while (true) {
//First read ADC
result = read_adc(); //0 - 1023
//calculate pulse width:
on_pulse = (result); //for a range of 0 to 1023uS
off_pulse = (1023 - on_pulse);
//next send pulse to servo output:
if (on_pulse > 20) { //The fastest you can on off is like 20us. so we do this
output_high(PIN_A2); //LED out = 1
delay_us(on_pulse); //high time
output_low(PIN_A2); //turn off pulse
delay_us(off_pulse); //remainder of 1ms PWM pulse max
} //if
} //while
} //main |
|
|