智能家居电机控制

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;

}

}

相关推荐
Porco.w1 小时前
STM32之ESP8266
stm32·单片机·嵌入式硬件
梁洪飞2 小时前
noc 片上网络
linux·arm开发·嵌入式硬件·arm
日更嵌入式的打工仔3 小时前
RS-485通讯协议
笔记·嵌入式硬件
蓝桥_吹雪3 小时前
HAL库深入了解--STM32与GPIO
单片机·嵌入式硬件
嗯嗯=3 小时前
STM32单片机学习篇5
stm32·单片机·学习
不能跑的代码不是好代码3 小时前
STM32:LED共阴/共阳连接与GPIO控制逻辑的关系,如何实现电平转换
stm32·单片机·嵌入式硬件
Jason_zhao_MR4 小时前
YOLO5目标检测方案-基于米尔RK3576开发板
linux·人工智能·嵌入式硬件·目标检测·计算机视觉·目标跟踪·嵌入式
qq_25814297-npl5 小时前
HEX数据00,显示为ASC码,怎么是是\0
单片机
不做无法实现的梦~6 小时前
使用ros2跑mid360的fastlio2建图
git·单片机·嵌入式硬件·gitcode
Joshua-a6 小时前
正点原子DS100示波器测DC电源纹波方法
单片机·嵌入式硬件