我想用两个定时器驱动一个伺服电机。
time1,16位,管理20毫秒周期,并将输出PORT.B0设置为1.Time0,8位,管理1毫秒的持续时间,并设置输出端口B0至0。我的问题是:伺服不动。我断开了伺服电机。我连接了一个范围。当我用范围内的光标来测量时间的时候,我检查了这个周期T持续时间大约是40毫秒,而不是20毫秒2x。当我用范围内的光标测量时间的时候,thTaTon持续时间大约是2毫秒,而不是1毫秒2x。在这些条件中,我理解了为什么伺服。马达不动。我检查了所有的计算,以便设置良好的值TMR0、TMR1L和TMR1H寄存器。但是在代码下://PIC16F87// 8 MHz / /Time1 / /预分频器1:1//TMR1预加载=25536 / /中断时间:20 MsHar CNT=0;空隙IITTIMER 1){T1CONN=0X01;//T1CON寄存器>TMR1ON位=1>Time1。TMR1IFN1比特=0;//PIR1寄存器>TMR1没有溢出。1H=0x63;TMR1LY=0xC0;TMR1IELY比特=1;//PIE寄存器>TMR1溢出中断。ITCON=0xC0;//ITCCON寄存器>GIE位=1和PEE比特=1。}//Time0//预分频器1:1/TMR0预加载=56//中断时间:100个US(0,1 ms)空隙IITTIMER 0(){OpthyReg=0x88;/PSA比特=1和G。Prescaler被分配给WDT & GT;PosiClar=1:1//RBPU位=1;GTCO0=0xA0;}空隙中断(){{(TMR1IF1比特=1){TMR1IF=56;TMR1H=0x63;TMR1L=0xC0;PORT.B0=1;TMR0IFN1比特=0;}(TMR0IF1比特=1){CNT++;TMR0IFN1比特=0;TMR。t;0=56;} }安塞尔=0;ANSELH=0;C1ONYBIT=0;C2ONYBIT=0;TrISD=0;//端口D COMPURE EN SORTI.PORTD=0;//初始化端口DD 0 0 .IITIN Time1();{IF(CNT= 10){PORT.B0= 0;CNT= 0;},同时(1);}
以上来自于百度翻译
以下为原文
I want to drive a servomotor with two timers.Timer1, 16 bits, manage the 20 mS period, and set output portd.b0 to 1.Timer0, 8 bits, manage the 1 mS Ton duration, and set output portd.b0 to 0.My problem :Servo doesn't move. I disconnected the servomotor. I connected a scope.When measuring time with cursors on the scope I checked that period T duration is about 40 mS, instead of 20 mS. 2x more.When measuring time with cursors on the scope I checked that Ton duration is about 2 mS, instead of 1 mS. 2x more. In these conditions I understand why the servomotor doesn't move. I checked all calculations in order to set with good values TMR0, TMR1L and TMR1H registers. But in vain. Here under the code :// PIC 16F887
// 8 MHz// Timer1
// Prescaler 1:1
// TMR1 preload = 25536
// Interrupt time : 20 mSchar cnt = 0;void Init_Timer1()
{
T1CON = 0x01; // T1CON register > TMR1ON bit = 1 > Timer1 is enabled.
TMR1IF_bit = 0; // PIR1 register > TMR1 has not overflowed.
TMR1H = 0x63;
TMR1L = 0xC0;
TMR1IE_bit = 1; // PIE register > TMR1 overflow interrupt is enabled.
INTCON = 0xC0; // INTCON register > GIE bit = 1 and PEIE bit = 1.
}// Timer0
// Prescaler 1:1
// TMR0 Preload = 56
// Interrupt time : 100 uS (0,1 mS)void Init_Timer0()
{
OPTION_REG = 0x88; // PSA bit = 1 > Prescaler is assigned to WDT > Prescaler = 1:1
// RBPU bit = 1 > PORTB pull-up resistors are disabled.
TMR0 = 56;
INTCON = 0xA0;
}void Interrupt()
{
if (TMR1IF_bit = 1)
{
TMR1IF_bit = 0;
TMR1H = 0x63;
TMR1L = 0xC0;
portd.b0 = 1;
TMR0IF_bit = 0;
}
if (TMR0IF_bit = 1)
{
cnt ++;
TMR0IF_bit = 0;
TMR0 = 56;
}
}void main()
{
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;
TRISD = 0; // PORT D configuré en sortie.
PORTD = 0; // Initialisation du PORT D à 0. Init_Timer1();
Init_Timer0(); do
{
if (cnt = 10)
{
portd.b0 = 0;
cnt = 0;
}
}
while(1);
}
0