智能家居电机控制

sMotorHandle gs_MotorHandle =

{

0,

};

void Moto_Init( void )

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(ULN2003_SYSCTL_PERIPH_CLK, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = A_PHASE_PIN;

GPIO_Init(A_PHASE_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = B_PHASE_PIN;

GPIO_Init(B_PHASE_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = C_PHASE_PIN;

GPIO_Init(C_PHASE_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = D_PHASE_PIN;

GPIO_Init(D_PHASE_PORT, &GPIO_InitStructure);

ULN2003_ResetAllPhase( );

}

/**

* @name ULN2003_ResetAllPhase

* @brief 复位A、B、C、D(相位)

* @param[in] void

* @return void

*/

void ULN2003_ResetAllPhase ( void )

{

A_PHASE_RESET;

B_PHASE_RESET;

C_PHASE_RESET;

D_PHASE_RESET;

}

static u8 i = 0;

/**

* @name Motorcw

* @brief 电机正转

* @param[in] void

* @return void

*/

void Motorcw( void )

{

switch ( i++ )

{

case 0: //A

A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 1: //AB

A_PHASE_SET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 2: //

A_PHASE_RESET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 3: //B

A_PHASE_RESET;B_PHASE_SET;C_PHASE_SET;D_PHASE_RESET;

break;

case 4: //C

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_RESET;

break;

case 5: //CD

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_SET;

break;

case 6: //

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;

break;

case 7: //D

i=0;

A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;

break;

default:

break;

}

delay_ms(2);

}

void Motorccw( void )

{

switch ( i-- )

{

case 0: //A

i=7;

A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 1: //AB

A_PHASE_SET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 2: //

A_PHASE_RESET;B_PHASE_SET;C_PHASE_RESET;D_PHASE_RESET;

break;

case 3: //B

A_PHASE_RESET;B_PHASE_SET;C_PHASE_SET;D_PHASE_RESET;

break;

case 4: //C

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_RESET;

break;

case 5: //CD

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_SET;D_PHASE_SET;

break;

case 6: //

A_PHASE_RESET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;

break;

case 7: //D

A_PHASE_SET;B_PHASE_RESET;C_PHASE_RESET;D_PHASE_SET;

break;

default:

break;

}

}

void MotorStop( void )

{

ULN2003_ResetAllPhase( );

}

//由于 *一个脉冲* *输出轴* 转0.08789度(电机实转0.08789*64=5.625度),即步进角为5.625度。则转完A-B-C-D为 *8个脉冲* ,即0.08789*8=0.70312度。若称A-B-C-D为一个周期,则j为需要的转完angle角度所需的周期数。

void Motor_PreSet(eMotorDutyCycle eM, u32 tim, u32 speed)

{

gs_MotorHandle.eStatus = eM;

gs_MotorHandle.u32Time = tim;

gs_MotorHandle.u32Speed = speed;

}

void Motor_Millisecond( void )

{

if (gs_MotorHandle.u32Time > 0)

{

gs_MotorHandle.u32Time--;

if (gs_MotorHandle.u32Time == 0)

{

gs_MotorHandle.eStatus = Staus_None;

MotorStop( );

}

}

gs_MotorHandle.u32Cnt++;

if (gs_MotorHandle.u32Cnt % gs_MotorHandle.u32Speed == 0)

{

switch (gs_MotorHandle.eStatus)

{

case Status_CW:

Motorcw( );

break;

case Status_CCW:

Motorccw( );

break;

case Staus_None:

default:

break;

}

}

if (gs_MotorHandle.u32Cnt % 1000 == 0)

{

gs_MotorHandle.u32Cnt = 0;

}

}

相关推荐
晶振厂家-晶发电子3 天前
晶振在5G时代的角色:高精度时钟的核心支撑
单片机·嵌入式硬件·5g·晶振·电子元器件·晶振知识
F137298015573 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
小莞尔3 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
三佛科技-187366133973 天前
分享机械键盘MCU解决方案
单片机·嵌入式硬件·计算机外设
李永奉3 天前
51单片机-使用IIC通信协议实现EEPROM模块教程
单片机·嵌入式硬件·51单片机
工大一只猿3 天前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔3 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
风_峰3 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
bing_feilong3 天前
STM32精准控制水流
单片机·嵌入式硬件
Hello_Embed3 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件