📄 main._c
字号:
D/A初始化函数
******************************************************/
void da_init(void)
{
cal_timer1(speed);
PORTA|=(1<<DA_WR);
PORTD|=(1<<DA_CS);
DDRA|=(1<<DA_WR);
DDRD|=(1<<DA_CS)|(1<<DA_AB);
DDRC|=(1<<DA_SIN)|(1<<DA_COS);
DATA_OUT=0x00;
DATA_IO=0xff;
timer1_init();
}
/****************************************************************
A/D初始化
****************************************************************/
void adc_init(void)
{
ADMUX=0b00000000; //选择ADC0做AD输入
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADATE); //允许AD转换,128分频
}
void adc_change(void)
{
unsigned char i;
unsigned char k;
unsigned int j;
unsigned int g;
unsigned char l;
unsigned int s[10];
g=0;
for (l=0;l<10;l++)
{
for (k=0;k<10;k++)
{
ADCSRA|=(1<<ADSC);
i=ADCSRA;
while ((i&(1<<ADIF))==0)
{i=ADCSRA;}
j=ADC;
s[k]=j;
ADCSRA|=(1<<ADIF);
}
ins(s,10);
j=0;
for (k=0;k<5;k++)
{
j=j+s[k+2];
}
j=j/5;
g=g+j;
}
g=g/10;
g=g*6/10;
if (g<=6)
{g=1;}
else
{g=g-6;}
if (g>=600)
{g=600;}
if (g<=1)
{g=1;}
out_ctr=g;
}
void ins(unsigned int *item,unsigned char count)
{
unsigned char a;
unsigned char b;
unsigned int t;
for (a=1;a<count;a++)
{
t=item[a];
b=a-1;
while(b>=1&&t<item[b])
{
item[b+1]=item[b];
b--;
}
item[b+1]=t;
}
}
/*
*电流输出允许函数
*/
void i_en(void)
{
TIMSK |= (1<<OCIE1A);
PORTC|=(1<<INT);
DDRC |=(1<<INT);
}
/*
*电流输出禁止函数
*/
void i_disen(void)
{
TIMSK &=~(1<<OCIE1A);
delay_ms(100);
PORTC&=~(1<<INT);
DDRC |=(1<<INT);
}
/*
*根据速度判断细分数函数
*/
unsigned char sp_mic(unsigned int sudu)
{
unsigned char i;
if (sudu<=410)
{
if (sudu<=290)
{
if(sudu<=210)
{
if (sudu<=140)
{i=16;}
else
{i=8;}
}
else
{i=4;}
}
else
{i=2;}
}
else
{i=1;}
return i;
}
/*
缓启动函数
*/
void speed_slow(unsigned int speed_start,unsigned int speed_end)
{
unsigned char i;
for (i=0;speed_start<speed_end;i++)
{
cal_timer1(speed_start);
speed_start=speed_start+5;
delay_ms(slow_time); //缓启动加速延时
}
speed_start=speed_end;//abcd
cal_timer1(speed_start);
}
void cal_timer1(unsigned int sudu)
{
unsigned long data;
micros_nu=sp_mic(sudu);
data=1200000/(sudu*micros_nu);
if (sudu==1)
{
data=data/8;
TCCR1B |= (1<<CS11);
TCCR1B &=~(1<<CS10);
data=data-1;
}
else
{
TCCR1B |= (1<<CS10);
TCCR1B &=~(1<<CS11);
data=data-1;
}
time_da=data;
}
void out_ctrol(void)//abcd
{
unsigned char temp;
i_disen();
state&=0b11110101;
state2|=0b00100000;
}
void adc_ctrol(void)
{
adc_change();
speed_slow(speed,out_ctr);
if (out_ctr==speed)
{asm("nop");}
else
{speed=out_ctr;}
}
/*键盘处理函数*/
void key_disposal(void)
{
unsigned char i;
unsigned char j;
unsigned int temp;
switch (key)
{
/*******************************启停控制*********************************/
case runstop_nu:
if((state&0b00001000)==0) //判断启停状态
{
state|=0b00001000;
i_en();
speed_slow(1,speed);
}
else
{
i_disen();
state&=0b11110111;
}
key=empty;
break;
/******************************正反转控制**********************************/
case cwccw_nu:
if ((state|0b11111110)==0b11111110) //判断正反状态
{
state|=0b00000001;
}
else
{
state&=0b11111110;
}
speed_slow(1,speed);
key=empty;
break;
}
}
//状态初始化函数
void state_init(void)
{
if ((state&0b00001000)!=0) //如果电机没有运行可执行确认操作
{
state&=0b11110111;
key=runstop_nu;
}
key_disposal();
}
//停止所有运行
void all_stop(void)
{
i_disen();
state&=~(1<<RUN_STOP);
}
//所有参数的出厂缺省值
void defult_fac(void)
{
unsigned int temp;
if ((EEPROMread(DEFAULT_ROMADDR))!=0)
{
do {temp=EEPROMwrite(DEFAULT_ROMADDR,0);}
while(temp>0);
speed=50;
EEPROMWriteWord(speed_romaddr,&speed);
state=0;
do {temp=EEPROMwrite(state_romaddr,state);}
while(temp>0);
pump_tab=1;
do {temp=EEPROMwrite(pump_tab_romaddr,pump_tab);}
while(temp>0);
state_other=0;
do {temp=EEPROMwrite(state_other_romaddr,state_other);}
while(temp>0);
}
//do {temp=EEPROMwrite(DEFAULT_ROMADDR,1);}
//while(temp>0);
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
unsigned char i;
CLI();
defult_fac();
EEPROMReadWord(speed_romaddr,&speed);
pump_tab=EEPROMread(pump_tab_romaddr);
if ((pump_tab>=31)||(pump_tab==0))
{pump_tab=1;}
if ((speed>600)||(speed==0))
{speed=1;}
state=0;
state0=0;
state1=0;
state2=0;
wrong=0;
micros_nu0=16;
in_out_number=in_int;
in_out_state=in_int;
port_init(); //端口初始化
da_init();
out_init(); //外控初始化
serial_init();
adc_init();
int0_init();
cal_timer1(speed);
GIFR=0;
TIFR=0;
SEI();
delay_ms(50);
i_disen();
job_att(0);
//临时
state2|=0b00000010;//进入计算机控制状态
while(1) //按键循环处理
{
job_att(1); //485
in_out_number=out_v;
switch (in_out_number)
{
case out_v : //外控电压
if (in_out_state!=out_v)
{
in_out_state=out_v;
out_ctrol();
pull_stop();
}
adc_ctrol();
break;
case out_pull:
if (in_out_state!=out_pull)
{
in_out_state=out_pull;
timer2_init();
pull_start();
}
if (speed_pull>2400)
{speed_pull=2400;}
if(speed_pull<=4)
{speed_pull=4;}
//cal_timer1();
speed_slow(speed,speed_pull/4);
speed=speed_pull/4;
default :
break;
}
out_key();
key_disposal();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -