[C9] Giúp tạo xung PWM

ConGaCon

Trứng gà
Sau 1 hồi lâu mày mò , nghiên cứu code mẫu về tạo xung PWM cho con led RGB , nhưng khi test thì led của e nó chỉ sáng có 1 màu xanh nước biển, xanh lè xanh lét , :-s:-s:-s:-s:-s .
Đây là đoạn code của e , các a giúp e , :-s .




int red, green, blue;
int main(void) {
WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
////////////////////////////////
TA0CTL = TASSEL_2 + MC_1;
TA0CCTL1 = OUTMOD_3;
//////////////////////////
TA1CTL = TASSEL_2 + MC_1;
TA1CCTL1 = OUTMOD_3;
////////////////////////////
P1DIR |= BIT2;
P1SEL |= BIT2;
P1SEL2 &=~BIT2;
//////////////////////////////
P2DIR |= (BIT2 + BIT4);
P2SEL |= (BIT2 + BIT4);
P2SEL2 &=~(BIT2 + BIT4);
//////////////////////////////////////
TA0CCR0 = 255;
TA0CCR1 = red;
//////////////////////
TA1CCR0 = 255;
TA1CCR1 = green;
TA1CCR2 = blue;
/////////////////////
red = 21; green = 179; blue = 203;
_BIS_SR(LPM0_bits + GIE);



return 0;
}
 

honghiep

Cố Vấn CLB
Staff member
Sau 1 hồi lâu mày mò , nghiên cứu code mẫu về tạo xung PWM cho con led RGB , nhưng khi test thì led của e nó chỉ sáng có 1 màu xanh nước biển, xanh lè xanh lét , :-s:-s:-s:-s:-s .
Đây là đoạn code của e , các a giúp e , :-s .




int red, green, blue;
int main(void) {
WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
////////////////////////////////
TA0CTL = TASSEL_2 + MC_1;
TA0CCTL1 = OUTMOD_3;
//////////////////////////
TA1CTL = TASSEL_2 + MC_1;
TA1CCTL1 = OUTMOD_3;
////////////////////////////
P1DIR |= BIT2;
P1SEL |= BIT2;
P1SEL2 &=~BIT2;
//////////////////////////////
P2DIR |= (BIT2 + BIT4);
P2SEL |= (BIT2 + BIT4);
P2SEL2 &=~(BIT2 + BIT4);
//////////////////////////////////////
TA0CCR0 = 255;
TA0CCR1 = red;
//////////////////////
TA1CCR0 = 255;
TA1CCR1 = green;
TA1CCR2 = blue;
/////////////////////
red = 21; green = 179; blue = 203;
_BIS_SR(LPM0_bits + GIE);



return 0;
}
Bạn lưu ý là vi điều khiển chạy tuần tự từng dòng lệnh, dòng nào viết trước được thực hiện trước.
ở đây bạn gán các giá trị CCRx = red/green/blue trước khi gán giá trị cho các biến red/green/blue nên giá trị chứa trong CCRx lúc này là các giá trị khởi tạo của red/green/blue (= 0)
 

ConGaCon

Trứng gà
à há, hèn gì, e làm được rồi, con LED đã đổi màu, tks a :1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye: . Nhân tiện cho e hỏi luôn về cách làm mấy con led sáng lên từ từ , ta gán trị của CCR1 = i và cho biến i tăng lên từ từ , nhưng khoảng i tăng như thế nào là hợp lí và trị của CCR0 là bao nhiêu , thời gian delay ,... để ta kịp nhận ra sự thay đổi đó . :3cool_adore:
 

honghiep

Cố Vấn CLB
Staff member
à há, hèn gì, e làm được rồi, con LED đã đổi màu, tks a :1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye::1cool_byebye: . Nhân tiện cho e hỏi luôn về cách làm mấy con led sáng lên từ từ , ta gán trị của CCR1 = i và cho biến i tăng lên từ từ , nhưng khoảng i tăng như thế nào là hợp lí và trị của CCR0 là bao nhiêu , thời gian delay ,... để ta kịp nhận ra sự thay đổi đó . :3cool_adore:
các thanh ghi CCRx là thanh ghi 16 bit, giá trị tối đa bạn có thể gán cho các thanh ghi này là 65535.
chu kì xung được tính = CCR0 x T (T là chu kì của clock cho timer). Để không thấy LED bị nháy bạn phải tính sao cho tần số xung > 24 Hz
Về việc thời gian delay giữa các lần thay đổi giá trị CCRx theo i phụ thuộc vào bạn muốn chia thành bao nhiêu mức sáng. Sau đó bạn tính ra thời gian cho hợp lí
 
Top