ผมใช้ micro C pro อยู่ครับ ร่วมกับ proteus เชื่อใจได้พอสมควร ใช้ลองก่อนโปรแกรมลงชิพจริงครับ
ที่กำลังทำคือเอา pic มาขับ led 20W ให้มันปรับความสว่างได้น่ะครับ ตอนนี้เวิคแล้วครับ
จริงๆถ้าจะทำแค่นี้คงไม่ต้องวุ่นวาย ใช้แค่ฟังชั่น pwm ก็พอเพราะ led ดวงเดียว แต่ที่วุ่นทำเพราะกะจะทำป้ายโฆษณา แบบที่เป็นกระจกที่เขียนอะไรลงไปแล้วมันเรื่องแสงน่ะครับ ซึ่งจะใช้ Led หลายสี หลายชุดขับอิสระ คงใช้ฟังชั่น pwm ไม่ได้เพราะ pic ตัวนึงมันมีแค่ 2 channel น่ะครับ เลยตอนแรกกะจะใช้ timer มาคอย interupt เพื่อเป็น time base ในการแสดงผล แต่ปรากฎว่า interupt เร็วๆมันสะดุด ช้าๆไฟมันก็กระพริบ สุดท้ายเลยวนลูปแบบพื้นๆไปก่อน โปรแกรมตามนี้ครับ
char i,j,K,Butflag;
unsigned m;
void bakgwait(unsigned n);
void main()
{
i = 0;
j = 1;
K = 0; //pwm flag
Butflag = 1; //get button flag
m = 0;
trisB = 0b01100000; //set port b6,5 to input
portB = 0b01100000;
WPUB = 0b01100000; //set port b6,5 weak pullup
ans11_bit = 0; //set port b5 to digital i/o
while(1)
{
if(Butflag) //if grt button flag=1
{
if(rb5_bit==0) //check up but
{
if(j<98) j++;
}
if(rb6_bit==0) // chek down button
{
if(j>1) j--;
}
Butflag=0; //delay for next button input by set flag=0
}
if(i>j) // check duty cycle
{
if(k==0) RB7_bit=0;
K=1;
}
if(i>99) //reach 100% duty cycle
{
K=0;
i=0;
Rb7_bit=1;
}
bakgwait(25000); //check reach delay time
i++;
}
}
void bakgwait(unsigned n)
{
m++;
if (m==n)
{
m=0;
Butflag=1;
}
}
สรุปว่าโปรแกรมนี้ ไม่ได้ดีเลย์โดยการหยุดอยู่กับที่ คือมันจะทำงานไปเรื่อยพอครบเวลาก็เซ็ทแฟลกว่าครบเวลาแล้วครับ วิธีนี้ดีที่ได้ความถี่ราวๆ 1K ขึ้นไปที่ clock 20M(ไม่รู้ว่าถ้าเพิ่มโค๊ดลงไปอีกความถี่จะตกลงแค่ไหน)
ส่วนวงจรตอนนี้เป็นแบบในรูปครับ สวิทชิ่งที่ 18V 1.5A ครับ แต่ผมไม่ได้ใช้สวิทแต่ใช้เป็นไอซีทัชเซ็นเซอร์น่ะครับ
ปล.led 20W สว่างสะใจมากๆ ไว้ทำโคมเสร็จจะเอามาลงให้ดูกันครับ