配置成产生波形状态,选择at91rm9200内部时钟或外部时钟作为16位tc的时钟源,启动计数器(clksta), tc从零开始计数。 当tc中的值与ra中的值相等,输出控制器可使tioa输出高电平;当tc中的值与rc中的值相等, 输出控制器可使tioa输出低电平,同时复位tc,使tc重新计数。这样可产生方波信号。rc的值控制tioa输出脉冲的频率,ra和rc可控制pwm的占控比。当tc的值达到ra、rb、rc的值时还可产生中断,也可把这些中断屏蔽掉。这样产生的pwm频率可从几赫兹到几兆赫兹。tiob产生pwm信号的原理与tioa完全一样。 本系统中把tioa配置为脉冲输出口,tiob为外部事件触发输入口(即伺服控制卡中的脉冲计数卡产生的中断), 当伺服控制卡中的脉冲计数器(8254)计数到设定值时产生中断,由tiob通过rs触发器停止tc计数。这样可实现伺服电机的速度和位置控制。 伺服控制卡的脉冲计数器的核心器件是两片8254[5],可进行六路独立的脉冲计数,如图4所示。2 软件开发 由于目前大部分基于arm9的嵌入式系统一般用linux,用于实时性要求不高的的设备。采用μc/os需
at91rm9200定时器使用论坛用9200的人不少,我在使用9200定时器是遇到一个想不通的问题,请大家帮忙看看,有兴趣的可以在板上运行试试,谢谢大家了!我的想法是想用9200的定时器产生一个频率可变的方波来控制电机的转速,我原始的想法是利用定时器的rb比较寄存器来控制tiob引脚置低,用rc比较寄存器来控制tiob引脚置高,同时rc还用来复位定时器,清tc_cv。这样我就可以在初始化完成后只通过改变rc值来改变输出的频率。实际测试中发现rc每次赋值相同时一切正常,输出按预期执行。当将输出频率逐步提高,也就是rc值不断变小时出现随机的定时器tc_cv值没清零的情况,也就是tc_cv一直计数到ffff才清零,这样我输出的脉冲就不对了。我现在改成让rc产生中断,在中断中改变rc值,还是不行,具体表现在我在中断中读取tc_cv值,这时应该是比较小的值,或为零才对,而实际读到的值会有几千的值出现,这时我如果将一个小于tc_cv的值写入rc,这样rc也就没法复位定时器了只有等tc_cv溢出后,下个周期才能正常工作。我现在不明白的是,在产生rc中断时计数器应该已经清零,为什么读出来的值偶尔会这么大?以下