智能家居电机控制

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;

}

}

相关推荐
hahaha60166 小时前
模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号
stm32·单片机·嵌入式硬件
小小少年1238 小时前
基于蓝牙的stm32智能火灾烟雾报警系统设计
stm32·单片机·嵌入式硬件
点灯小铭9 小时前
基于51单片机红外避障车辆高速汽车测速仪表设计
单片机·嵌入式硬件·汽车·毕业设计·51单片机·课程设计
猫猫的小茶馆15 小时前
【STM32】将 FreeRTOS移植到STM32F103RCT6 详细流程
stm32·单片机·嵌入式硬件·mcu·智能硬件
智驾15 小时前
MCU平台化实践方案
单片机·嵌入式硬件·mcu·嵌入式
NormalConfidence_Man19 小时前
【RT Thread】使用QEMU模拟器结合GDB调试RT Thread内核
linux·嵌入式硬件
日更嵌入式的打工仔21 小时前
uC/OS-III 队列相关接口
单片机
李法师_1 天前
lwIP MQTT 心跳 Bug 分析与修复
linux·c语言·stm32·单片机·lwip
易享电子2 天前
基于单片机步进电机控制电机正反转加减速系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·51单片机·proteus·智能家居
易享电子2 天前
基于单片机空调温度控制测温ds18b20系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·51单片机·proteus·智能家居