Do đặc tính mã hóa PPM, các xung PWM của mỗi kênh sau khi giải mã từ xung PPM nhận được, sẽ xuất hiện tuần tự và nối tiếp nhau trong chu kỳ khung. Do đó, chỉ cần dùng 1 bộ timer để đo độ rộng xung của cả 4 kênh vì khơng bao giờ xuất hiện 2 xung cùng lúc. Tuy nhiên Phải dùng các nguồn ngắt có mức ưu tiên khác nhau để xác định các cạnh lên và xuống, do cạnh xuống của xung này có thể xuất hiện đồng thời với cạnh lên của xung tiếp theo. Timer 1 phục vụ việc đo độ rộng xung chạy liên tục từ khi hàm setup được gọi.
Hình 2.96. Tín hiệu PWM
Xét một kênh điều khiển bất kỳ. Khi có một sự kiện ngắt thay đổi trạng thái xảy ra, trình phục vụ ngắt sẽ căn cứ vào mức logic hiện tại để biết vừa nhận được cạnh lên hay cạnh xuống. Khi mức logic hiện tại là 1 nghĩa là nhận được cạnh lên, trình phục vụ ngắt tiến hành lưu giá trị bộ đếm TCNT1 hiện tại vào biến tạm. Khi mức logic hiện tại là 0 nghĩa là nhận được cạnh xuống, trình phục vụ ngắt lấy giá trị bộ đếm hiện tại trừ đi giá trị lưu tạm trước đó sẽ ra được độ rộng xung hiện tại. Chu kỳ đo đầu tiên có thể sai vì khơng chắc sẽ bắt được cạnh lên đầu tiên.
Hình 2.97. Lưu đồ trình phục vụ ngắt thay đổi trạng thái tại 1 kênh bất kỳ interrupt [EXT_INT5] void interrupt [EXT_INT5] void
ext_int5_isr(void) { if ( PINE.5) // rising { RxChannel1Start = TCNT1; } else { // falling RxChannel1 = TCNT1 - RxChannel1Start; } } CH1=RxChannel1%100; CH2=RxChannel2%100; CH3=RxChannel3%100;