单片机学习小组
直播中

费加罗

8年用户 784经验值
私信 关注

怎样去设计一种基于STM32寄存器版的嵌入式智慧仓库呢

基于STM32寄存器的嵌入式智慧仓库是由哪些部分组成的?
怎样去设计一种基于STM32寄存器版的嵌入式智慧仓库呢?

回帖(1)

王建

2022-1-17 11:43:38
1、项目背景

项目环境背景

随着科技的发展,许多智能产品如雨后春笋般出现,如智能电视、扫地机器人、智能冰箱等等,但鲜有人关注与日常生活接触较少的领域,更别说将智能技术应用于此。根据我们小组的调研,我们了解到在仓库设备方面的技术还相对原始,例如手动开关铁闸门、手动开关灯等等。同时,通过往年的新闻,我们还发现由于相对落后的开关门技术,往往会有员工疏忽大意,导致利益的损失。
项目运作的可行性

我们的项目实现了智能开关仓库门、仓库灯的功能,同时保证了员工的生命安全以及最大可能降低了仓库利益的损失,该项目技术不需要过多的资源便可实现,可以大范围地运用到每一个仓库当中。
项目的优势分析

低成本、实用性高、技术难度较低,可兼容各种型号的门与灯等等。
2、总体设计

利用了红外障碍感应器、人体感应器、led灯、蜂鸣器、电机。当人经过门前被红外障碍感应器探知,此时电机启动,门开;led灯亮,蜂鸣器响声一次。人体感应器检测到人在仓库时,led灯常亮。当人离开仓库时,人体感应器感应不到人体,蜂鸣器响声一次, led灯关闭,电机启动,门关。
3、外设选取和引脚连接

外设选取

1)普中STM32F1ZET6开发板

2)步进电机

3)光敏感应器

4)红外人体感应器

5)水位感应器

引脚连接

人体传感器连接PD0口
红外传感器连接PD1口
发光二极管连接PD2口
水位传感器连接PD3口
步进电机四根线分别连接F0、F1、F2、F3
4、系统架构

1、总体架构

2、智能开门

3、智能开灯

4、智能熄灯与关门

5、智能检测水位

5、驱协开发

LED驱动

推挽输出模式

// void ledInit();使用cube自动生成的
__HAL_RCC_GPIOC_CLK_ENABLE();


HAL_GPIO_WritePin(GPIOC, Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
                          |Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin, GPIO_PIN_SET);
                          
GPIO_InitStruct.Pin = Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
                          |Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


// Led.c
#include "Led.h"


void drv_led_on(int no){//打开led
        switch(no){
                case 1:
                                GPIOC->BRR = (1uL << 0);
                                break;
                case 2:
                                GPIOC->BRR = (1uL << 1);
                                break;
                case 3:
                                GPIOC->BRR = (1uL << 2);
                                break;
                default:
                                break;
        }
}


void drv_led_off(int no){//关闭led
        switch(no){
                case 1:
                                GPIOC->BSRR = (1uL << 0);
                                break;
                case 2:
                                GPIOC->BSRR = (1uL << 1);
                                break;
                case 3:
                                GPIOC->BSRR = (1uL << 2);
                                break;
                default:
                                break;
        }
}


蜂鸣器驱动

推挽输出模式

// Beep.c
#include "Beep.h"


// 寄存器操作初始化
void Beep_Init_Reg(void)
{
                RCC->APB2ENR |= (1uL << 3) ;  // 启动PE口的时钟源 设置位高电平
                //配置GPIOE的第五号引脚
                GPIOB->CRL |= (1uL << 20) | (1uL << 21);   // MODE0[1:0] = 11b 输出模式 最大速率50 MHz
                GPIOB->CRL &= ~(1uL << 22) | (1uL << 23 ) ; // CNF5[1:0] = 00b 带数字推挽输出
       
                GPIOC->ODR |= 1 << 5; // 将第五号引脚置为一


}




//蜂鸣器响
void Beep_Ring_Reg(void)
{
                int a=100;
                while(a--)
                {
                        GPIOB->ODR |= 1 << 5;
                        LOS_TaskDelay(5);
                        GPIOB->ODR = ~(1 << 5);
                        LOS_TaskDelay(5);
                }
}




步进电机驱动

推挽输出模式
采用了四相八拍,数组zz[]为正转,fz[]为反转

// motor.c
#include "motor.h"
int zz[8]={1,3,2,6,4,12,8,9};//A AB B BC C CD D DA
int fz[8]={8,12,4,6,2,3,1,9};//D DC C CB B BA A AD
void Step_Motor_GPIO_Init(void)
{
                RCC->APB2ENR |= (1uL << 7);
       
                GPIOF->CRL |= (1uL << 0) | (1uL << 1);//F0
                GPIOF->CRL &= ~(1uL << 2) | (1uL << 3);
       
                GPIOF->CRL |= (1uL << 4) | (1uL << 5);//F1
                GPIOF->CRL &= ~(1uL << 6) | (1uL << 7);
               
                GPIOF->CRL |= (1uL << 8) | (1uL << 9);//F2
                GPIOF->CRL &= ~(1uL << 10) | (1uL << 11);
       
                GPIOF->CRL |= (1uL << 12) | (1uL << 12);//F3
                GPIOF->CRL &= ~(1uL << 14) | (1uL << 15);
}
void delay(){//延时
        int i;
        for(i=250;i>=0;i--){
                for(int j=100;j>=0;j--);
        }
}
void motor_front_step(void){//正转
        int a=100;
        while(a--){
                for(int i=0;i<8;i++){
                        GPIOF->ODR = zz;
                        delay();
                }
        }
}
void motor_rear_step(void){//反转
        int a=100;
        while(a--){
                for(int i=0;i<8;i++){
                        GPIOF->ODR = fz;
                        delay();
                }
        }
}
void motor_overturn_step(void){//正反转
        int a=1000;
        while(a--){
                for(int i=0;i<8;i++){
                        GPIOF->ODR = zz;
                        delay();
                }
                for(int i=0;i<8;i++){
                        GPIOF->ODR = fz;
                        delay();
                }
        }
}
水位感应驱动


// water.c
#include "water.h"
void Water_Init(void){
        RCC->APB2ENR |= (1uL << 5);
       
        GPIOD->CRL &= ~(1uL << 12) | (1uL << 13) | (1uL << 15);//PD3口 悬空输入
        GPIOD->CRL |= (1uL << 14);
}
int Water_state(void){
        if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) == 1){
                return 1;
        }
        return 0;
}


红外人体传感器驱动

#include "sensor.h"
void Sensor_GPIO_Init(){
       
        RCC->APB2ENR |= (1uL << 5);
       
        GPIOD->CRL &= ~(1uL << 0) | (1uL << 1) | (1uL << 3);//PD0口 悬空输入
        GPIOD->CRL |= (1uL << 2);
       
        GPIOD->BRR = (1uL << 0);
}
int Sensor_state(){
        if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_0) == 1){
                return 1;
        }
        return 0;
}


红外光敏感应器驱动

#include "infrared.h"
void Infrared_GPIO_Init(){
       
        RCC->APB2ENR |= (1uL << 5);
       
        GPIOD->CRL &= ~(1uL << 4) | (1uL << 5) | (1uL << 7);//PD1口 悬空输入
        GPIOD->CRL |= (1uL << 6);
       
        GPIOD->BRR = (1uL << 0);
}
int Infrared_state(){
        if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1) == 1){
                return 1;
        }
        return 0;
}


6、业务层开发

中断

#include "Exti.h"


void EXTIKeyInit(void){
        RCC->APB2ENR |= (1uL << 0);
       
        AFIO->EXTICR[0] &= ~(0xF << 12);//选择EXTI3
        AFIO->EXTICR[0] |= (4 << 12);
       
        AFIO->EXTICR[1] &= ~(0xF << 0);//选择EXTI4
        AFIO->EXTICR[1] |= (4 << 0);
       
       
        EXTI->IMR |= (3uL << 3);//打开外部中断
        EXTI->FTSR |= (3uL << 3);//设置为下降沿触发
       




                HAL_NVIC_SetPriority(EXTI3_IRQn, 7, 0); //设置优先级
    HAL_NVIC_SetPriority(EXTI4_IRQn, 8, 0);
               


                HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能
                HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}




void EXTI3_IRQHandler(void){
                LOS_TaskDelay(100);
                HAL_GPIO_EXTI_IRQHandler(K_DOWN_Pin);
}
void EXTI4_IRQHandler(void){
                LOS_TaskDelay(100);
                HAL_GPIO_EXTI_IRQHandler(K_RIGHT_Pin);
}


//写在main.c中的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
                LOS_TaskDelay(20);
        switch(GPIO_Pin){
                case K_LEFT_Pin :
                {
                        motor_front_step();
                        drv_led_on(1);
                        Diode_on();
                                break;
                }
                case K_DOWN_Pin :
                {
                        motor_rear_step();
                        drv_led_off(1);
                        Diode_off();
                                break;
                }
                case K_RIGHT_Pin :
                {
                        if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0) == 0){
                                drv_led_off(1);
                                Diode_off();
                        }else{
                                drv_led_on(1);
                                Diode_on();
                        }
                                break;
                }
        }
}


轮询


void Key_Flash(void){
        Step_Motor_GPIO_Init();
        Infrared_GPIO_Init();
        Beep_Init_Reg();
        Diode_Init();
        Water_Init();
        int door_state = 0;//门的状态 0为关 1为开
        while(1){
                if(Infrared_state() == 0 && Sensor_state() == 0 && door_state == 0){
                        drv_led_on(1);
                        Diode_on();
                        motor_front_step();
                        door_state = 1;
                        Beep_Ring_Reg();
                        LOS_TaskDelay(1000);
                }else if(Sensor_state() == 1 && door_state == 1){
                        drv_led_on(1);
                        Diode_on();
                }else if(Sensor_state() == 0 && door_state == 1){
                        Beep_Ring_Reg();
                        LOS_TaskDelay(1000);
                        drv_led_off(1);
                        Diode_off();
                        motor_rear_step();
                        door_state = 0;
                }
                if(Water_state() == 1){
                        int a=100;
                        while(a--){
                                Diode_on();
                                Beep_Ring_Reg2();
                                Diode_off();
                                Beep_Ring_Reg2();
                        }
                }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分