ATtiny13Aを使ってラジコン用サーボを動かしてみた。
使用したデジタルサーボの仕様は1520μs/333Hzとなっていて、プロポから送信される各チャンネルへの送出周期よりずっと短い。
サーボの動作が本当に追従するのか試してみた。
パルスの幅は600μs~2400μsとし、パルスの周期は333Hzで時間は3ms(3000μs)である。
タクトスイッチによってパルスの幅を変えられるようにしてみた。ソースコードは次のとおり。
#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>
#define cls_bit(reg,bit) reg &= ~(1<<bit) // ビットクリア
#define set_bit(reg,bit) reg |= (1<<bit) // ビットセット
int main(void)
{
// ポート設定
// 76543210
DDRB = 0b00001001; // PB0:Buzzer(出力) PB1,PB2:Button(入力)
PORTB = 0b00000110; // PB1,PB2:プルアップ
int sw;
int pulse=150;
while (1)
{
sw=0;
if ( bit_is_clear(PINB,PB1) ){
sw=1;
}
if ( bit_is_clear(PINB,PB2) ){
sw=-1;
}
pulse = pulse+sw;
if (pulse>240) pulse=240;
if (pulse<60) pulse=60;
set_bit(PORTB,PORTB3);
for(int i=0;i<pulse;i++){
_delay_us(8.5);
}
cls_bit(PORTB,PORTB3);
for(int j=0;j<300-pulse;j++){
_delay_us(8.5);
}
}
}
信号を計測した結果は次のとおり。
パルス幅 600μs |
パルス幅 1500μs |
パルス幅 2400μs |
タクトスイッチで変化するパルス幅に合わせ、サーボが動作することを確かめた。
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() |
|
![]() | ![]() |
|
![]() | ![]() | ![]() |
パルス幅 600μs
パルス幅 1500μs
パルス幅 2400μs














