0

这是关于如何在 PIC 上使用 timer0 的一般问题。

我正在尝试使用 PIC18f87k22 和 arduino pro trinket 构建直流电机控制系统。

在我的程序中,我有一个名为get_courant(). 此函数向 trinket 发送请求并读取接收到的答案(通过 uart)并将该值存储在我的一个全局变量中,从而实现它。

我想做的是按如下方式使用计时器:

如果get_courant()需要超过 10us 才能继续,则跳过它,直接转到我的 main.js 中的其余说明。

我知道我应该在调用函数之前启动一个计时器,并以某种方式读取计时器值来决定是否跳过它。

但是,如果我在调用函数后检查计时器值,那么如果 `get_courant() 的执行超过 10us,我的时间可能会被浪费,在这种情况下,计时器是无用的。

任何提示可以帮助我实现我想要实现的目标(如果我的英语不好的话,IDK)?这是get_courant()如果可以提供任何帮助的代码:

int16_t get_courant()
{
 uint8_t courant1;
 uint8_t courant2;
 int16_t courant;

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000001);
        }
 if(EUSART1_is_rx_ready())
        {
        courant1= EUSART1_Read(); 
        }

 if(EUSART1_is_tx_ready())
        {
            EUSART1_Write(0b00000010);
        }
 if(EUSART1_is_rx_ready())
        {
        courant2= EUSART1_Read(); 
        }
 if (CheckBit(courant1,7))
 {
    bit_clr(courant1,7);
    courant = (courant1 << 8) | courant2;
    courant = - courant;
 }
 else 
 {
    courant = (courant1 << 8) | courant2;
 }

 return courant;   
 }

这是我调用 get_courant() 的主要功能的一部分:

while(!Stop_flag)
{   
    int i=0;
    do
    {


        Mesure_courant=get_courant();
        Tension_initiale = PID_Courant(Mesure_courant,Erreur_courant,Consigne_courant,Integrale_courant,Kp_courant,Ki_courant,Kd_courant,Wind_up_flag_courant);
        i++;
        Put_Rapport_Cyclique(Tension_initiale, Choix_Mode);

    } while(i<10);
4

1 回答 1

1

根据 PIC18f87k22 数据表第 193 页中的 T0CON 寄存器的第 7 位 TMR0ON 正在激活定时器以计数或停止它。关于这一点,你可以在你想要测量停留时间的功能中设置 TMR0ON 并检查 10uS,你必须在你离开功能后重置它(在 10uS 或无论如何在 10uS 之后)你还应该确保在清除 TMR0ON 之后或在设置 TMR0ON 之前,您必须清除计时器保持的旧值,以免影响之前的测量

于 2018-07-05T14:21:45.070 回答