166 lines
2.8 KiB
C
166 lines
2.8 KiB
C
#include "moter.h"
|
|
#include "dev_flash.h"
|
|
#include "debug.h"
|
|
#include "commend.h"
|
|
#include "mymisc.h"
|
|
#include "board.h"
|
|
|
|
|
|
// 运行状态
|
|
typedef enum{
|
|
STOP=0,
|
|
INITING=1,
|
|
DOWNING=2,
|
|
UPING=3,
|
|
}moter_stat;
|
|
|
|
|
|
typedef struct{
|
|
int inited;
|
|
pwm_def *pwm;
|
|
rt_event_t event;
|
|
int run;
|
|
int want_count;
|
|
int count;
|
|
int max_count;
|
|
moter_stat stat;
|
|
}self_def;
|
|
|
|
|
|
self_def g_self;
|
|
|
|
|
|
|
|
#define MOTER_MAX_COUNT 22000
|
|
|
|
#define MOTER_END_EVENT 0x1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void end_irq(void *t)
|
|
{
|
|
self_def *s=t;
|
|
if(s->inited)
|
|
rt_event_send(s->event,MOTER_END_EVENT);
|
|
}
|
|
|
|
|
|
|
|
static void moter_run(void *t)
|
|
{
|
|
self_def *s=t;
|
|
uint32_t ev;
|
|
while(s->run)
|
|
{
|
|
rt_event_recv(s->event,0xffffffff,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&ev);
|
|
if(ev&MOTER_END_EVENT)
|
|
{
|
|
if(s->stat==INITING)
|
|
{
|
|
s->count=0;
|
|
}else if(s->stat==DOWNING)
|
|
{
|
|
s->count+=s->want_count;
|
|
}else if(s->stat==UPING)
|
|
{
|
|
// 向上时 s->want_count 为负数,所以依然是加
|
|
s->count+=s->want_count;
|
|
if(s->count<0) s->count=0;
|
|
}
|
|
s->stat=STOP;
|
|
DBG_LOG("moter stoped.");
|
|
emit moter_end_signal(s);
|
|
}
|
|
ev=0;
|
|
}
|
|
}
|
|
|
|
|
|
void moter_start(int fre,int step_count)
|
|
{
|
|
self_def *s=&g_self;
|
|
if(s->inited==0)
|
|
{
|
|
DBG_WARN("moter object is not inited.");
|
|
return;
|
|
}
|
|
moter_start_slot(s,fre,step_count);
|
|
}
|
|
|
|
void moter_start_slot(void *t,int fre,int step_count)
|
|
{
|
|
self_def *s=t;
|
|
if(s->stat!=STOP)
|
|
{
|
|
DBG_WARN("moter is running!");
|
|
return ;
|
|
}
|
|
if(s->count+step_count>s->max_count)
|
|
{
|
|
DBG_WARN("steps count exceeded limit!,max=%d",s->max_count);
|
|
return ;
|
|
}
|
|
else{
|
|
DBG_LOG("s->count=%d,step_count=%d,s->max_count=%d",s->count,step_count,s->max_count);
|
|
}
|
|
if(step_count>0){
|
|
s->stat=DOWNING;
|
|
}else if(step_count<0){
|
|
s->stat=UPING;
|
|
}else{
|
|
DBG_WARN("step_count can not == 0");
|
|
return ;
|
|
}
|
|
s->want_count=step_count;
|
|
pwm_def *pwm=s->pwm;
|
|
pwm->set_fre(pwm,fre);
|
|
pwm->start(pwm,step_count);
|
|
}
|
|
|
|
|
|
void moter_init(void *t)
|
|
{
|
|
self_def *s=t;
|
|
DBG_LOG("moter init to zero.");
|
|
pwm_def *pwm=s->pwm;
|
|
pwm->set_fre(pwm,2000);
|
|
pwm->start(pwm,-22000);
|
|
}
|
|
|
|
int init_moter(void)
|
|
{
|
|
self_def *s=&g_self;
|
|
const sys_param_def *par=sys_param();
|
|
if(strcmp(par->device_type,"checker")==0){
|
|
pwm_def *pwm=dev_get("pwm1");
|
|
if(pwm==0){
|
|
cmd_print("can not find device \"pwm1\"");
|
|
return -1;
|
|
}
|
|
pwm->init(pwm);
|
|
pwm->set_irq_fun(pwm,end_irq,s);
|
|
s->pwm=pwm;
|
|
s->stat=INITING;
|
|
s->count=MOTER_MAX_COUNT;
|
|
s->max_count=MOTER_MAX_COUNT;
|
|
s->event=rt_event_create("moter_e",RT_IPC_FLAG_FIFO);
|
|
s->inited=1;
|
|
s->run=1;
|
|
rt_thread_t rt_t=rt_thread_create("moter_t",moter_run,s,2048,3,20);
|
|
rt_thread_startup(rt_t);
|
|
later_execute(moter_init,s,500);
|
|
app_variable("moter",s,0);
|
|
}
|
|
return 0;
|
|
}
|
|
app_init_export(init_moter)
|
|
|
|
|
|
|
|
|
|
|
|
|