辛苦码完一篇帖子,提交时弹出登录界面。只能重新写一份了。。。我也不记得之前说啥了。前面2篇介绍了系统框架和硬件组成。这篇开始分享软件编写。为了赶工,无刷电机驱动直接用的FOC例程。以下是程序的基本框架。
整个系统涉及的内容还是比较大,业余时间搞有点吃力呀。先从TLE9879的定时器开始吧。这里使用定时器作为ModBus数据帧断帧依据。
之前用过英飞凌的XMC4700,资源丰富性能强悍的一款MCU。这次拿到TLE9879QXA40,打开参考手册之后还是有点点小震惊的,十分简洁,让我有种用51的错觉。不过TLE9879QXA40集成了LIN收发器和MOSFET驱动器,花里胡哨的外设可能没那么丰富,总之我们先来体验一下。
定时器的使用
从手册看十分简洁。只有控制,模式,重载,计数等几个寄存器。没什么特别需要研究的。直接结合例程去看,方便更快速上手。
void TIMER2_Init(void)
{
#if (TIMER2_Configuration_En == 1)
TIMER2->RC2H.reg = (uint8) TIMER2_RC2H;
TIMER2->RC2L.reg = (uint8) TIMER2_RC2L;
TIMER2->T2H.reg = (uint8) TIMER2_T2H;
TIMER2->T2L.reg = (uint8) TIMER2_T2L;
TIMER2->T2MOD.reg = (uint8) TIMER2_T2MOD;
TIMER2->T2CON.reg = (uint8) TIMER2_T2CON;
TIMER2->T2CON1.reg = (uint8) TIMER2_T2CON1;
#endif
}
首先配置重载值,这里配置为3036,计数器写入初值为0xFFFF。模式寄存器写入0x1F,使能分频并设置分频系数128。通过配置寄存器关闭一些特殊功能并打开中断。
void UART1_IRQHandler(void)
{
if ((uint8)TIMER2->T2CON1.bit.TF2EN == (uint8)1)
{
if ((uint8)TIMER2->T2CON.bit.TF2 == (uint8)1)
{
PORT_ChangePin(0x01, PORT_ACTION_TOGGLE);
TIMER2_Overflow_Int_Clr();
}
}
}
测试定时器程序,在定时器中断函数里写一个点灯的语句,就可以让LED闪烁起来了。
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。