|
//8MHz晶振,2014.7.7.19:21,保持舵机电压足够。单独供电。
//ADC基准电压取自+5v电源,可调电阻10K
#include"iom16v.h"
#include"macros.h"
#define uint unsigned int
#define uchar unsigned char
#pragma interrupt_handler adc_1:15
uint temp,temp_L,temp_H;
uchar num[]={0,0,0,0};
uchar table[]={ 0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //段码表
//***********************************************
void delay_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<200;j++)
;
}
//***********************************************
void show(uchar data0,uchar data1,uchar data2,uchar data3)
{
// PORTB=data0;
// PORTA=0x0f;
// PORTA=0x0e;
//delay_ms(2);
PORTB=data0|0xff;
PORTA=0x0f;
PORTB=0xff;
delay_ms(1);
PORTB=data1;
PORTA=0x0d;
delay_ms(2);
PORTB=0xff;
delay_ms(1);
PORTB=data2;
PORTA=0x0b;
delay_ms(2);
PORTB=0xff;
delay_ms(1);
PORTB=data3;
PORTA=0x07;
delay_ms(2);
PORTB=0xff;
delay_ms(1);
}
//***********************************************
void show_adc(uint temp)
{
num[0]=temp/1000;
num[1]=temp%1000/100;
num[2]=temp%1000%100/10;
num[3]=temp%1000%100%10;
show(table[num[0]]+0x80,table[num[1]],table[num[2]],table[num[3]]);
}
//***********************************************
void adc()
{
ADMUX=0x47;
//64分频,中断
ADCSRA=0xce;
SREG=0x80;
}
//***********************************************
void adc_1()
{
ADCSRA&=0xbf;//停ADC转换
temp_L=ADCL;
temp_H=ADCH;
temp=temp_H*256+temp_L;
OCR1A=((uint)(temp*(float)1.22)+280);//占空比0.5毫秒到2.5毫秒,OCR1A的值为250到1250,对应角度0到180.
//280的值,实验选取,比计算值大30
show_adc((uint)(temp*(float)0.1757));//为了显示0-180°
ADCSRA|=BIT(6);//启动转换
}
void adc_init()
{
uint i;
ADMUX=0x1e;
ADCSRA=0xc6;//ADC转换
delay_ms(10);
while(!((ADCSRA)&0x10));
ADCSRA=0x96;//停ADC转换
temp_L=ADCL;
temp_H=ADCH;
temp=temp_H*256+temp_L;
for(i=0;i<300;i++)
show_adc((uint)(temp*(float)4.342));
ADMUX=0x1f;
ADCSRA=0xc6;
delay_ms(10);
while(!((ADCSRA)&0x10));
ADCSRA=0x96;//停ADC转换
temp_L=ADCL;
temp_H=ADCH;
temp=temp_H*256+temp_L;
for(i=0;i<500;i++)
show_adc((uint)(temp*(float)4.342));
}
//***********************************************
void main()
{
uint data;
DDRA=0x0f;
DDRD=0x30;
DDRB=0xff;
adc_init();
TCCR1A=0x80;//相位频率修正模式
TCCR1B=0x12;//8分频,晶振8兆赫兹
ICR1H=0x27;//周期20毫秒
ICR1L=0x10;
OCR1A=250;//初始值占空比0.5毫秒
adc();
while(1)
{
;
}
}
|
|