智能家居电机控制

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(相位)

* @paramin 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 电机正转

* @paramin 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;

}

}

相关推荐
youcans_2 小时前
【STM32C5教程】(3)GPIO 按键输入实验
stm32·单片机·嵌入式硬件
俊基科技3 小时前
回音消不掉、底噪压不住、主板还对不上口?——A-59P 多功能语音处理模组技术解析
嵌入式硬件·回音消除·ai降噪模块
北京盛世宏博4 小时前
通信异常深度排查:以太网温湿度设备 TCP 粘包、UDP 丢包根治方案
单片机·网络协议·tcp/ip·udp·以太网·传感器·温湿度
蓝天居士4 小时前
PY32F系列MCU在串口接收时跑飞的根因分析(2)
单片机·嵌入式硬件
wuyk5557 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
创界工坊工作室8 小时前
24-基于单片机的仓鼠养殖环境监控系统设计
stm32·单片机·嵌入式硬件·proteus
碧海银沙音频科技研究院8 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
comyccccc9 小时前
PCB走线设计秘籍:从载流到3D预览全解析学习笔记
单片机·嵌入式硬件
俊基科技9 小时前
A-59 工业级 AI 语音处理模组:100 dB 消回音 + 神经网络降噪的工程实践
嵌入式硬件·神经网络·硬件开发·语音模块·回音消除·拾音降噪
endeavor129 小时前
can总线(五)
c语言·stm32·单片机·can