最近开始学习飞控的PWM信号输入,发现以前的认知不太正确。一年前做的蓝牙信号接收器,直接给了4个PWM信号的输出。而PWM的频率是arduino默认的频率。但是最近才发现,遥控器的PWM信号常用的是50Hz,也就是信号间隔20ms。
因此打算自己弄个定时器来生成中断,然后设置管脚的高低电平来模拟PWM。
以前用的是MEGA328P,现在打算改用TINY24了。
这是个16位的定时器,时钟频率是8M:
void timer1_init(void)
{
TCCR1A = 0;
TCCR1B = 0;
// 这里设置256分频
TCCR1B |= (_BV(CS12));
// 其他控制寄存器都设置为空
TCCR1C = 0;
//这里设置了一个1.5ms的延时
//值 = 等待的时长(us) * 时钟频率(MHz)/分频
// 46 = 1500 * 8 / 256
TCNT1 = 65536 - 46;
// 开启溢出中断
TIMSK1 = 1;
}
中断响应函数
ISR(TIMER1_OVF_vect)
{
// 这里重置触发计数器
TCNT1 = 65536 - 46;
}
看起来还是很简单。在设置寄存器的时候,要把未用的位先置0。