0417.c
来自「两相混合式步进电机驱动」· C语言 代码 · 共 242 行
C
242 行
#include<avr/io.h>
#include<avr/pgmspace.h>
#include <compat/ina90.h>
#include<avr/signal.h>
uint8_t dirstate,xfnum;
uint8_t buf[4];
prog_char A[80]={255,255,254,253,252,250,248,245,242,239,
236,232,227,222,217,212,206,200,194,187,
180,173,166,158,150,142,133,125,116,107,
98, 88, 79, 70, 60, 50, 40,30, 20, 10,
0, 10, 20, 30,40, 50, 60,70, 79, 88,
98,107,116,125,133,142,150,158,166,173,
180,187,194,200,206,212,217,222,227,232,
236,239,242,245,248,250,252,253,254,255
};
prog_char B[160]= {8, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, //40
2, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,//80
4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,//120
1, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,//160
};
uint8_t stage_drop,space_drop;
uint8_t phasestep,phaseout,currenta,currentb,space,table;
volatile uint8_t stage,stage1,cpnum;
void delay(uint8_t k) //;16m -0.5s
{
uint8_t i,j,m,n;
for(i=0;i<k;i++)
{
for(j=0;j<20;j++)
{
for(m=0;m<200;m++)
{
for(n=0;n<200;n++)
;
}
}
}
}
//电流初始化
void initialcurrent(void)
{
currenta=pgm_read_byte(&A[0]);
currentb=pgm_read_byte(&A[40]);
phaseout=pgm_read_byte(&B[0]);
phaseout<<=4;
PORTA|=phaseout;
PORTC=currenta;
asm volatile("sbi 0x1B,2"::);//daca
asm volatile("cbi 0x1B,1"::);//wr
asm volatile("sbi 0x1B,1"::);//wr
PORTC=currentb;
asm volatile("cbi 0x1B,2"::);//daca
asm volatile("cbi 0x1B,1"::);//wr
asm volatile("sbi 0x1B,1"::);//wr
}
//0 0 0 //5 对于清华丰10/5细分,将拨码3,2拨到地,用拨码1切换
//0 0 1 //10
//0 1 0 //8 对于万博丰10/8细分,将拨码3接地,拨码2接1,用拨码1切换
//0 1 1 //10
//1 1 1 //2
//1 1 0 //20
void loadbm(void)
{
xfnum=PIND&0xf8; //pd2,pd1,pd0 三位拨码
switch(xfnum)
{
case 0: space=4;table=0;break; //5
case 1: space=4;table=0;break; //10
case 2: space=5;table=0;break; //8
case 3: space=4;table=0;break; //10
case 6: space=2;table=0;break;//20
case 7: space=20,table=0;break;// 2
case 8: space=1;break;//40
default: space=4;table=0;break;//默认10细分
}
}
/*void loaddropdata(void)
{
uint8_t i;
while(!eeprom_is_ready());
eeprom_read_block(buf,(uint8_t *)0x10,4);
for(i=0;i<4;i++)
{
if(buf[i]>0x20)
buf[i]=0;
}
stage_drop=buf[0];
space_drop=buf[1];
dirstate=buf[2];
stage=buf[3];
}
*/
int main(void)
{
PORTA=0X02;//PA1-wr,PA2-daca
DDRA=0XFF;
PORTC=0X00;
DDRC=0Xff; //
//delay(10);
PORTD=0X00;
DDRD=0XE0; //PD6 -OFFCURRENT.PD5-FREE
currenta=0;
currentb=0;
stage=0;
stage1=0;
phasestep=0;
cpnum=0;
table=0;
loadbm();
while(bit_is_set(PORTE,0)); //若过热,则停止
initialcurrent(); //向tlc7528发出电流台阶信号.
GICR|=0XC0; //INT1(CP)INT0(VOL_LESS)INT2(OVERHOT) 中断使能
MCUCR=0X0A;
//开总中断
TIMSK=0X80; //T1 INTRRUPT
TCCR1B=0X00;
_NOP();
_NOP();
_SEI();
while(1);
}
SIGNAL( SIG_INTERRUPT1 )//cp
{
if(bit_is_clear(PIND,3)) //pc4 (cp)
{
cpnum++;
asm volatile("cbi 0x12,6"::);//取消自动半流
if(bit_is_clear(PIND,4)){ //dir=0,default
stage+=space;
if(stage==80) stage=0;
phasestep+=space;
if(phasestep==160) phasestep=0;
}
else if(bit_is_set(PIND,4)){//dir=1;
if(stage==0) stage=80-space;
else stage-=space;
if(phasestep==0) phasestep=160-space;
else phasestep-=space;
}
if(stage<40) stage1=stage+40;
else stage1=stage-40;
currenta=pgm_read_byte(&A[stage]);
currentb=pgm_read_byte(&A[stage1]);
phaseout=pgm_read_byte(&B[phasestep]);
phaseout<<=4;
PORTA|=phaseout;
PORTC|=currenta;
asm volatile("sbi 0x08,0"::);//daca 0x08=portc
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
PORTC|=currentb;
asm volatile("cbi 0x08,0"::);//daca
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
TCNT1=25536;
TCCR1B=0X01;
// TIMSK1=0X01;
}
}
SIGNAL( SIG_INTERRUPT0)
{
_CLI();
PORTA=0X02; //相位=0000,wr=1;
asm volatile("sbi 0x12,6"::);//OFFCURRENT (PORTD.6)
}
SIGNAL(SIG_OVERFLOW1)
{
TCCR1B=0X00;;
asm volatile("sbi 0x12,6"::);//OFFCURRENT PORTD,6
}
//priority:fo-低触发最高,undervoltage-低触发次高 ,overvol低触发再次之,overhot高触发最低
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?