Trích:
Nguyên văn bởi tranvu_hop
Em muốn hỏi là tại sao fải để là
set_pwm1_duty(500L)
500L, nếu bỏ L đi thì sao, em chưa hiểu chỗ này. Mong các anh chỉ đáp
|
Lệnh set_pwm1_duty(value); dùng xác định duty cho xung PWM trên chân CCP1.
Tùy theo kiểu của value mà cách tính khác nhau.
- Nếu value là giá trị kiểu int 8bit thì CCS C sẽ dịch trái 2 bit để đủ 10bit
Công thức tính: %duty = value/(PR2 +1)*100%
- Nếu value là giá trị long int 16bit thì CCS C sẽ bỏ đi 4 bit cao
Công thức tính: %duty = (value & 1023)/(4*(PR2 +1))*100%
Chú ý rằng nếu bác set giá trị duty vượt quá 100%, thì ôi thôi chân điều chế xung nó không bị xóa về mức thấp nữa.
Hai đoạn code sau đều cho giá trị duty 50% trên chân CCP1:
Code:
int value = 128;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
set_pwm1_duty(value);
Code:
int16 value = 512;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
set_pwm1_duty(value);
Hôm sau sẽ gởi cho mấy bác chương trình tính toán pwm trực quan, đơn giản nhưng hiệu quả.