|
这是驱动舵机的程序
舵机为1-2ms的脉冲
间隔是20ms
帮忙拿示波器测一下看看??告诉我波形。
要是不行帮改改。
CodeVision
#include <mega16.h>
int zkb;
int t1,t2;
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
//每次触发为20微秒
TCNT2=0xEC;
if(t1!=0){
t1-=1;
}else{
PORTA.0=!PINA.0;
if(PINA.0==1){
t1=zkb/20;
t2=(20000-zkb)/20;
}else
{
t1=t2;
}
}
}
// Declare your global variables here
void delay_1ms(void); //函数声明,本实验中会用到这两个函数
void delay_nms(unsigned int n);
void main(void)
{
int aa=20;
/*初始化参数*/
zkb=1500;
t1=zkb/20;
t2=20000-t1;
/********************************************/
OSCCAL=0X95;//系统时钟校准,不同的芯片和不同的频率
PORTA=0x00;
DDRA=0x00;
DDRA.0=1;
PORTA.0=1;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0xEC;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Global enable interrupts
#asm("sei")
while (1)
{
delay_nms(1000);
zkb+=aa;
if(zkb>2000||zkb<1000){
zkb=1000;
aa=-aa;
}
}
}
void delay_1ms(void)//1ms延时函数
{
unsigned int i;
for (i=0;i<150;i++)
{
}
}
void delay_nms(unsigned int n)//延时n毫秒
{
unsigned int i;
for (i=0;i<n;i++)//执行n次1毫秒延时
delay_1ms();
} |
|