|
最近在研究多个舵机的控制,上网找了很多资料,编写了一个程序,用三个电位器分别控制三个舵机,只用tc0定时计数器,最后无法实现,原理是对的,不知道哪里出了问题,程序如下:
#include <iom16v.h>
#include <macros.h>
#include "1602LCD_drive.h"
//unsigned char line1_data[]={"ADC1:"}; //
//unsigned char line2_data[]={"ADC3:"};
//unsigned char line3_data[]={"ADC2:"};
#define uchar unsigned char
#define uint unsigned int
#define OUTPUT PORTC
#define SER0 0x01
#define SER1 0x02
#define SER2 0x04
#define ADCN ADMUX
#define ADC0 0x40
#define ADC1 0x41
#define ADC2 0x42
char Counter=1;
char num=0;
char time=0;
/************延时函数***********/
void delay(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
/*********端口设置函数*********/
void port_init(void)
{
PORTB=0XFF; //设置1602端口的
DDRB=0XFF;
DDRD=0XFF;
PORTD=0Xff;
DDRC=0XFF; //设置pc口为舵机pwm输出
PORTC|=0X00;
DDRA&=0X00; //adc口设为输入,带上啦电阻
PORTA|=0Xff;
}
void timer0_init()
{
SREG=0X80;
TIMSK|=(1<<TOIE0); //是能溢出中断
TCCR0|=(0<<CS02)|(0<<CS01)|(1<<CS00); //12mhz晶振 无预分频60/12m=5us
TCNT0=0; //计数器初值
}
/**********ad转换函数**********/
unsigned int adc_()
{
unsigned int addata;
ADMUX=0X40; //AVCC为基准电,AD0为输入通道 01000010
ADCSRA=0XC0; //使能ADC,自动连续转换 11000000
ADCSRA|=BIT(ADSC); //开始A/D转换
while(!(ADCSRA&(BIT(ADIF)))); //等待转换完成
addata=ADCL; //获取ADC结果
addata=addata+ADCH*256;
return addata; //返回ADC值
}
/**ADC通道转换函数**/
uint adc_change()
{
unsigned int ada, adcx;
ada=adc_();
adcx=ada/2.5+100;
return adcx;
}
/********************主函数**********************/
void main()
{
port_init();
adc_();
timer0_init();
adc_change();
}
#pragma interrupt_handler timer0_ovf:10
void timer0_ovf()
{
TCNT0=196; //重新赋值256-196=60,溢出一次等于5us
adc_change(); //adc值转换成counter计数值最大值
Counter++;
time++;
if(num==0&&Counter<=1) //这里
{
ADCN=ADC0; //设置adc通道为adc0
OUTPUT|=SER0; //输出口为PC0
//k[0]=adc_change()/100;
//k[1]=(adc_change()%100)/10;
//LCD_write_char(14,1,k[0]+0x30);
//LCD_write_char(15,1,k[1]+0x30);
}
if(num==1&&Counter<=1)
{
ADCN=ADC1; //adc通道为adc1
OUTPUT|=SER1; //修改输出口为pc1
//k[0]=adc_change()/100;
//k[1]=(adc_change()%100)/10;
//LCD_write_char(5,1,k[0]+0x30);
//LCD_write_char(6,1,k[1]+0x30);
}
if(num==2&&Counter<=1)
{
ADCN=ADC2; //adc通道为adc2
OUTPUT|=SER2; //输出口为pc2
}
if(Counter>=adc_change()) //如果计数值大于adc转换值
{
OUTPUT&=0X00; //所有输出口拉低
num=num+1; //num+1
Counter=0; //重新计数
if(num>=3) //num大于三所有c口拉低
OUTPUT&=0X00;
}
if(time>=4000) //计数达到4000?4000*5us=20000us=20ms为舵机周期
{
num=0; //全部重新赋值
time=0;
Counter=0;
}
}
小白一个,求大神指教!
|
|