Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
em có bo mạch quảng cáo 31 cổng(pic 28 chân) em thấy lạ chỗ là nó PWM được tất cả 31 cổng (có 2 con logic) để mở rộng cổng,không hiểu làm kiểu gì ta khi chỉ có 2 kênh PWM nó không PWM nguồn đâu nha
Cái này đơn giản mà. Ví dụ dùng cổng AND hoặc OR thì dùng 1chân ON/OFF, 1 chân PWM. Nếu dùng 74HC595 thì có thể PWM vào chính chân OE.
Bạn hãy xem con mở rộng cổng là gì, xem chân RST hoặc Enable ở đâu rồi dùng oscilloscope kiểm tra là thấy ngay.
cám ơn 2 cao thủ đã trả lời !
-bác DuyPhi sao lại dùng nick này vậy
-em thì dùng 1 con fet treo ở đầu nguồn PWM all bo luôn
-em thắc mắc là những chân không cho vào 595 mà nó vẫn PWM được ,tầm khoảng hơn chục chân không qua 595 mà vẫn PWM all bo chả nhẽ nó quét nhanh sao ? giải thích giúp em với
Thực tế để driver cho led tui ít khi dùng phần cứng vì k đủ chân PWM, với lại khi cần thay đổi độ rộng xung cho các chân khác nhau thì k được nên tui dùng phần mềm k à bác, dĩ nhiên tần số đạt được là k cao nhưng ứng dụng cho led thì ok.
Thực tế để driver cho led tui ít khi dùng phần cứng vì k đủ chân PWM, với lại khi cần thay đổi độ rộng xung cho các chân khác nhau thì k được nên tui dùng phần mềm k à bác, dĩ nhiên tần số đạt được là k cao nhưng ứng dụng cho led thì ok.
ý mình là không phải bo này để chuyên PWM ,nó là bo led quảng cáo 31 cổng để tạo thêm hiệu ứng người ta cho thêm chức năng PWM cả 31 cổng với con pic chỉ 28 chân ,và tần số thì chỉnh bằng 1 cái biến trở ,,PWM với 595 thì mấy anh có giải pháp rồi ,nhưng còn hơn chục chân của nó nối không qua con ghi dich nào mà PWM được luôn mới khó hiểu chứ
Biến trở kết nối chân ADC nhé, giá trị này tùy chỉnh độ rộng xung hoặc tần số nha bác. Thông thường tui tùy chỉnh độ rộng xung, còn tần số tui cho cố định. Khi lập trình led, vì phải tạo hiệu ứng cho nhiều PIN nên tui khai báo 1 mảng lưu trạng thái của PIN với độ lớn tương ứng số PIN sử dụng, VD: PIN_PRE[31], trong đó PIN_PRE[0]....PIN_PRE[5] dành cho cụm led A, PIN_PRE[6]....PIN_PRE[10] dành cho cụm led B,.....Việc tạo hiệu ứng được thực hiện trên mảng này nha.
Tạo 1 hàm xuất trạng thái ra chân VXL, vd:
void xuat_pin()
{
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_C2,PIN_PRE[1]);
.
.
.
}
để tạo PWM cần tạo 1 timer phụ, nằm trong ngắt timer, VD tui xử dụng timer 1, timer phụ lấy tên là "A_TIMER".
#int_TIMER1
void TIMER1_isr(void) //500us ngắt nha, vd thôi.
{
set_timer1(xxxxx);
if (A_TIMER>0) A_TIMER--;
else A_TIMER = nnn; //như vậy T=500us * nnn
}
sửa lại hàm xuất trạng thái
void xuat_pin()
{
if (A_TIMER<BBBB)
{
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_C2,PIN_PRE[1]);
.
.
.}
else
{
output_bit(PIN_A1,OFF);
output_bit(PIN_C2,OFF);
.
.
}
giá trị BBBB lấy từ ADC thông qua 1 phép tính nào đó tùy bạn muốn.
Nếu muốn độ rộng xung cho từng PIN thì lồng hàm if vào cho mỗi lệnh output_bit(..,..)
Thân.
Bạn có thể tham khảo chương trình này để dễ hình dung, nhưng chương trình này chỉ dùng ADC để tăng giảm tốc độ chạy cho hiệu ứng chứ không PWM. Không đính kèm được, thôi paste vào vậy:
#define DB0 PIN_C5
#define DB1 PIN_C4
#define DB2 PIN_C3
//----------------------gia tri
#define SANG 1
#define TAT 0
//----------------------duong bien
#define ADD_DOWNDB 0 //dia chi duoi cho DB
#define ADD_UPDB 2 //dia chi tren cho DB
//----------------------noi dung 1
#define ADD_DOWN1 3 //dia chi duoi cho HU 1
#define ADD_UP1 3 //dia chi tren cho HU 1
int8 PIN[12];
int8 db_index=0,idb=0;
int8 value_adc=100;
int8 hu1_index=0;
int16 DB_TIMER=0,db_delay=500;
int16 A_TIMER=0,hu1_delay=500;
#int_TIMER1 //TA=16MHz, delay 0,5ms
void TIMER1_isr(void)
{
set_timer1(63535);
if (DB_TIMER>0) DB_TIMER--;
if (A_TIMER>0) A_TIMER--;
}
//-------------------------------------
void Db_tat()
{
int8 jdb;
for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
{
PIN[jdb]=TAT;
}
}
void Db_sang()
{
int8 jdb;
for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
{
PIN[jdb]=SANG;
}
}
void Hu1_tat()
{
int8 j1;
for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
{
PIN[j1]=TAT;
}
}
void Hu1_sang()
{
int8 j1;
for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
{
PIN[j1]=SANG;
}
}
//-------------------------------------
void Duong_bien()
{
int8 kdb;
if(db_index==0)
{
// db_delay=DELAY_DB_MIN;
idb=ADD_DOWNDB;
db_index=1;
}
else if (db_index==1)
{
if (DB_TIMER==0)
{
for (kdb=ADD_DOWNDB;kdb<=ADD_UPDB;kdb++)
{
PIN[kdb]=TAT;
}
PIN[idb]=SANG;
idb++;
if (idb>ADD_UPDB)
{
idb=ADD_DOWNDB;
}
DB_TIMER=db_delay;
}
}
else
{
idb=0;
}
}
//--------------------------------------
void Hu1()
{
if (hu1_index==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=1;
}
else if (hu1_index==1)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=2;
}
}
else if (hu1_index==2)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=3;
}
}
else if (hu1_index==3)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=4;
}
}
else if (hu1_index==4)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=5;
}
}
else if (hu1_index==5)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=6;
}
}
else if (hu1_index==6)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=7;
}
}
else if (hu1_index==7)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay * 5;
Hu1_sang();
hu1_index=1;
}
}
}
//------------------------------------
void Calculate_delay()
{
value_adc = read_adc ();
db_delay = make16(0,value_adc);
hu1_delay = db_delay *10;
db_delay = db_delay *2;
}
Biến trở kết nối chân ADC nhé, giá trị này tùy chỉnh độ rộng xung hoặc tần số nha bác. Thông thường tui tùy chỉnh độ rộng xung, còn tần số tui cho cố định. Khi lập trình led, vì phải tạo hiệu ứng cho nhiều PIN nên tui khai báo 1 mảng lưu trạng thái của PIN với độ lớn tương ứng số PIN sử dụng, VD: PIN_PRE[31], trong đó PIN_PRE[0]....PIN_PRE[5] dành cho cụm led A, PIN_PRE[6]....PIN_PRE[10] dành cho cụm led B,.....Việc tạo hiệu ứng được thực hiện trên mảng này nha.
Tạo 1 hàm xuất trạng thái ra chân VXL, vd:
void xuat_pin()
{
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_C2,PIN_PRE[1]);
.
.
.
}
để tạo PWM cần tạo 1 timer phụ, nằm trong ngắt timer, VD tui xử dụng timer 1, timer phụ lấy tên là "A_TIMER".
#int_TIMER1
void TIMER1_isr(void) //500us ngắt nha, vd thôi.
{
set_timer1(xxxxx);
if (A_TIMER>0) A_TIMER--;
else A_TIMER = nnn; //như vậy T=500us * nnn
}
sửa lại hàm xuất trạng thái
void xuat_pin()
{
if (A_TIMER<BBBB)
{
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_C2,PIN_PRE[1]);
.
.
.}
else
{
output_bit(PIN_A1,OFF);
output_bit(PIN_C2,OFF);
.
.
}
giá trị BBBB lấy từ ADC thông qua 1 phép tính nào đó tùy bạn muốn.
Nếu muốn độ rộng xung cho từng PIN thì lồng hàm if vào cho mỗi lệnh output_bit(..,..)
Thân.
rất cám ơn bác ạ, -.- chắc trình độ học vấn của em có hạn nên giải thích bác chưa hiểu được
Bạn có thể tham khảo chương trình này để dễ hình dung, nhưng chương trình này chỉ dùng ADC để tăng giảm tốc độ chạy cho hiệu ứng chứ không PWM. Không đính kèm được, thôi paste vào vậy:
#define DB0 PIN_C5
#define DB1 PIN_C4
#define DB2 PIN_C3
//----------------------gia tri
#define SANG 1
#define TAT 0
//----------------------duong bien
#define ADD_DOWNDB 0 //dia chi duoi cho DB
#define ADD_UPDB 2 //dia chi tren cho DB
//----------------------noi dung 1
#define ADD_DOWN1 3 //dia chi duoi cho HU 1
#define ADD_UP1 3 //dia chi tren cho HU 1
int8 PIN[12];
int8 db_index=0,idb=0;
int8 value_adc=100;
int8 hu1_index=0;
int16 DB_TIMER=0,db_delay=500;
int16 A_TIMER=0,hu1_delay=500;
#int_TIMER1 //TA=16MHz, delay 0,5ms
void TIMER1_isr(void)
{
set_timer1(63535);
if (DB_TIMER>0) DB_TIMER--;
if (A_TIMER>0) A_TIMER--;
}
//-------------------------------------
void Db_tat()
{
int8 jdb;
for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
{
PIN[jdb]=TAT;
}
}
void Db_sang()
{
int8 jdb;
for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
{
PIN[jdb]=SANG;
}
}
void Hu1_tat()
{
int8 j1;
for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
{
PIN[j1]=TAT;
}
}
void Hu1_sang()
{
int8 j1;
for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
{
PIN[j1]=SANG;
}
}
//-------------------------------------
void Duong_bien()
{
int8 kdb;
if(db_index==0)
{
// db_delay=DELAY_DB_MIN;
idb=ADD_DOWNDB;
db_index=1;
}
else if (db_index==1)
{
if (DB_TIMER==0)
{
for (kdb=ADD_DOWNDB;kdb<=ADD_UPDB;kdb++)
{
PIN[kdb]=TAT;
}
PIN[idb]=SANG;
idb++;
if (idb>ADD_UPDB)
{
idb=ADD_DOWNDB;
}
DB_TIMER=db_delay;
}
}
else
{
idb=0;
}
}
//--------------------------------------
void Hu1()
{
if (hu1_index==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=1;
}
else if (hu1_index==1)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=2;
}
}
else if (hu1_index==2)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=3;
}
}
else if (hu1_index==3)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=4;
}
}
else if (hu1_index==4)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=5;
}
}
else if (hu1_index==5)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_tat();
hu1_index=6;
}
}
else if (hu1_index==6)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay;
Hu1_sang();
hu1_index=7;
}
}
else if (hu1_index==7)
{
if (A_TIMER==0)
{
A_TIMER=hu1_delay * 5;
Hu1_sang();
hu1_index=1;
}
}
}
//------------------------------------
void Calculate_delay()
{
value_adc = read_adc ();
db_delay = make16(0,value_adc);
hu1_delay = db_delay *10;
db_delay = db_delay *2;
}
Cái chương trình trên là dùng ADC để chỉnh tốc độ chạy của hiệu ứng chứ không phải để PWM. Lưu ý là tui lập trinh cho LED thì xử lý data trên RAM (khai báo 1 mảng), mục đích là có nhiều hiệu ứng, có thể tạo 1 library (giống như lbrary có sẵn của PIC C Compiler) để sau này có thể sử dụng cho nhiều khách hàng khác nhau, nhiều bảng khác nhau mà k cần chỉnh sửa gì nhiều. CÒn việc xuất dữ liệu đó ra chân nào là việc của hàm "OUT_LED". Chính vì vậy có thể PWM từ hàm OUT_LED. Như vậy các PIN cần PWM thì đưa vào hàm IF, các chân không PWM thì nằm ngoài hàm IF.
void OUT_LED()
{
//các PIN không PWM
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_A2,PIN_PRE[1]);
output_bit(PIN_A3,PIN_PRE[2]);
//các PIN cần PWM thì đưa vào đây
if (A_TIMER<BBBB)
{
output_bit(PIN_C0,PIN_PRE[10]);
output_bit(PIN_C1,PIN_PRE[11]);
output_bit(PIN_C2,PIN_PRE[12]);
}
else
{
output_bit(PIN_C0,OFF);
output_bit(PIN_C1,OFF);
output_bit(PIN_C2,OFF);
}
}
Nếu bạn cần PWM cho 15 PIN thì đưa 15 PIN đó vào hàm if, các chân không PWM nằm ngoài hàm if.
Chốt lại là bạn muốn dùng PWM để điều chỉnh độ sáng của LED đúng k và các chân đó không có chức năng PWM!! Nếu cảm thấy k đúng thì tui sorry vậy, nếu đúng thì cách của tui vừa xử lý hiệu ứng, vừa PWM (tạm chấp chận cho LED được thì tần số không được cao). Nếu cần 1 cái PWM mẫu thì tui có thể viết cho bạn được để test chạy thử.
Cái chương trình trên là dùng ADC để chỉnh tốc độ chạy của hiệu ứng chứ không phải để PWM. Lưu ý là tui lập trinh cho LED thì xử lý data trên RAM (khai báo 1 mảng), mục đích là có nhiều hiệu ứng, có thể tạo 1 library (giống như lbrary có sẵn của PIC C Compiler) để sau này có thể sử dụng cho nhiều khách hàng khác nhau, nhiều bảng khác nhau mà k cần chỉnh sửa gì nhiều. CÒn việc xuất dữ liệu đó ra chân nào là việc của hàm "OUT_LED". Chính vì vậy có thể PWM từ hàm OUT_LED. Như vậy các PIN cần PWM thì đưa vào hàm IF, các chân không PWM thì nằm ngoài hàm IF.
void OUT_LED()
{
//các PIN không PWM
output_bit(PIN_A1,PIN_PRE[0]);
output_bit(PIN_A2,PIN_PRE[1]);
output_bit(PIN_A3,PIN_PRE[2]);
//các PIN cần PWM thì đưa vào đây
if (A_TIMER<BBBB)
{
output_bit(PIN_C0,PIN_PRE[10]);
output_bit(PIN_C1,PIN_PRE[11]);
output_bit(PIN_C2,PIN_PRE[12]);
}
else
{
output_bit(PIN_C0,OFF);
output_bit(PIN_C1,OFF);
output_bit(PIN_C2,OFF);
}
}
Nếu bạn cần PWM cho 15 PIN thì đưa 15 PIN đó vào hàm if, các chân không PWM nằm ngoài hàm if.
Chốt lại là bạn muốn dùng PWM để điều chỉnh độ sáng của LED đúng k và các chân đó không có chức năng PWM!! Nếu cảm thấy k đúng thì tui sorry vậy, nếu đúng thì cách của tui vừa xử lý hiệu ứng, vừa PWM (tạm chấp chận cho LED được thì tần số không được cao). Nếu cần 1 cái PWM mẫu thì tui có thể viết cho bạn được để test chạy thử.
xí quên là em dùng hitech với mikroc nhưng xem cách viết cũng ổn,thank vì đã rất nhiệt tình !
Anh kevo1tinh cho e hỏi là:
E băm xung PWM vào chân OE của 3 con 74595 cho led ma trận 8*8 2 màu RG để ra được 3 màu ,thì 3 con 74595 có dịch bit và đẩy bit kịp tốc độ của xung PWM không ạ (PWM đủ lớn để ra 24 hình/giây).À e hỏi thêm là phải băm xung PWM vào chân OE của cả 3 con hay chỉ cần cho con 595 đầu tiên ạ ?
Cảm ơn a
Anh kevo1tinh cho e hỏi là:
E băm xung PWM vào chân OE của 3 con 74595 cho led ma trận 8*8 2 màu RG để ra được 3 màu ,thì 3 con 74595 có dịch bit và đẩy bit kịp tốc độ của xung PWM không ạ (PWM đủ lớn để ra 24 hình/giây).À e hỏi thêm là phải băm xung PWM vào chân OE của cả 3 con hay chỉ cần cho con 595 đầu tiên ạ ?
Cảm ơn a
Cách PWM bằng phần phần như của tui chỉ thích hợp cho mấy cái bảng led, không khả thi khi xử dụng cho led ma trận. Tuy nhiên, góp ý thêm với bạn thế này:
- Sử dụng 2 kênh ccp1 và ccp2 để PWM cho 2 con 595, như thế thì phần mềm bạn rảnh việc để làm chuyện khác, đồng thời tần số cao sẽ giúp chuyển màu mềm mại hơn.
- Các tín hiệu điều khiển cho 2 con 595 này nên đấu song song (RCK,SCK), còn chân DS thì đấu riêng, OE thì đưa vào ccp, mỗi lần tạo clk để dịch bit, bạn sẽ dịch được 2 bit, sẽ tăng được tốc độ dịch bit và dư thời gian để làm việc khác.
- Điều hiển nhiên cách này theo phần cứng của bạn, điểm hạn chế của nó là bạn k thể tạo màu khác nhau cho từng pixel được.
Dạ thấy chú dinh... có vẻ mặn nồng với đèn sự cố nên cháu rình lúc chị hàng xóm đi vắng bắc thang trèo lên chụp mấy cái đèn nhà chị ấy ạ. Tầm vài trăm cái dùng tuýp led 220v bình thường ấy ạ. Dùng chiếu sáng thay bóng tuýp luôn Hơn...
Theo sơ đồ bạn đã vẽ thì đây chỉ là mạch nguồn flyback không cách ly, phản hồi cả dòng lẫn áp thôi mà. Một dạng nguồn CC-CV thông dụng. Kiếm con chip tốt làm là được, nếu chịu chạy dãy LED có cách ly thì càng tốt.
Phật có dạy là CHÁNH NIỆM (hay CHÍNH gì ấy, ĐT bị... rối loạn ngôn ngữ và trí nhớ, mong lượng thứ!) - CHÁNH NGỮ - CHÁNH HÀNH ĐỘNG, đó là đường hướng tới CHÁNH ĐẠO.
ĐT ngu muội nên cứ áp dụng vào điện tử: phải cố...
Cháu thấy chú nhat... viết toàn cái gì gì ấy ạ khó hiểu ghê, chắc mai cháu phải đi hỏi mấy anh chị lớp lớn hơn xem sao ạ. Những việc lớn tầm cỡ thì hông phải ai cũng có đủ kiến thức, thời gian, sức khỏe, tiền bạc, đam mê, kiên...
Thôi mà, anh em giúp đỡ nhau, có gì mà lớn tiếng?
Ai không chịu giúp đỡ nhau thì vào đây nhậu với tui. Bà xã hôm nay ngũ sớm tui được tự do, solo buồn quá, Nhathung,Dinhthuong ,Đinh Vặn gì đó tui cân tuốt.
Comment