基于STM32F407的HMI USART串口屏步进电机控制程序

目录

前言

一、效果

二、屏幕设计

三、部分代码

1.main.c

2.usart.c

3.其余代码

总结:参考+工程代码


前言

前段时间老师给了我一个项目,让我用HMI USART串口屏控制步进电机,事成之后有报酬嘿嘿,现在做完了,总结一下,废话不多说,直接上效果,工程代码在总结处。

一、效果

《关于我用HMI USART串口屏做了一个步进电机控制器这件事》

二、屏幕设计

主界面:

基于STM32F407的HMI USART串口屏步进电机控制程序_第1张图片

 移动控制界面:

基于STM32F407的HMI USART串口屏步进电机控制程序_第2张图片

间歇运动界面:

基于STM32F407的HMI USART串口屏步进电机控制程序_第3张图片

三、部分代码

1.main.c

#include "sys.h"
#include "delay.h"  
#include "usart.h"  
#include "led.h"
#include "usmart.h"
#include "key.h"
#include "driver.h"
#include "exti.h"

u32 frequency=2000;//1000-4000
long num=2000;//0-160*1000
unsigned char str[8];
u32 speed;
int left=0,right=1;
void RST(int front)
{
    if(front==left)
    {
        while(1)//左复位
        {
            if(!KEY0||page!=14)
            {
                delay_ms(10);
                if(!KEY0||page!=14)
                    break;
            }
            else
                Locate_Rle(150000,4000,CW);
        }
    }
    else
    {
        while(1)//左复位
        {
            if(!KEY1||page!=15)
            {
                delay_ms(30);
                if(!KEY1||page!=15)
                    break;
            }
            else
                Locate_Rle(150000,4000,CCW);
        }
    }
    TIM_Cmd(TIM8, DISABLE);
}
int main(void)
{  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);      //初始化延时函数
	uart_init(9600);		//初始化串口波特率为9600
	usmart_dev.init(84); 	//初始化USMART			
	LED_Init();					  //初始化LED
    EXTIX_Init();       //初始化外部中断输入 
	Driver_Init();			//驱动器初始化
	TIM8_OPM_RCR_Init(999,168-1); //1MHz计数频率  单脉冲+重复计数模式
    page=0;
//    RST(left);
	while(1) 
	{		 
         switch(page)
            {
                case 0:
                       TIM_Cmd(TIM8, DISABLE);  //使能TIM8
                       break;
                case 2:
                       Locate_Rle(distance,frequency,CW); 
                       break;//顺时针转向右
                case 1:
                       Locate_Rle(distance,frequency,CCW);  
                       break;//逆时针转向左
                case 3:frequency=1000;//速度设置
                       break;
                case 4:frequency=2000;
                       break;
                case 5:frequency=3000;
                       break;
                case 6:frequency=4000;
                       break;
                case 7:frequency=100;distance=20;//速度位移设置
                       break;
                case 8:frequency=1000;distance=200;break;
                case 9:frequency=1000;distance=1000;break;
                case 10:frequency=1000;distance=2000;break;
                case 13:flag=1;     //间歇运动
                        while(flag)
                        {
                            Locate_Rle(distance,frequency,CW);
                        }
                        flag=1;
                        delay_ms(1000);
                        while(flag)
                        {
                            Locate_Rle(distance,frequency,CCW);
                        }
                        flag=1;
                        delay_ms(1000);
                        break;
               case 14: 
                        RST(left);
                        page=0;
                        break;   
               case 15: 
                        RST(right);
                        page=0;
                        break; 
               case 16: 
                        break;   
               case 17: 
                        
                        break; 
               
            }
  
	}
}

2.usart.c

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		  
         if(page==11&&num_flag<2)//运动位移设置
        {
             numbuf[num_flag]=Res;
             num_flag++;
             if(num_flag==2)
            {
                distance=(numbuf[1]*256+numbuf[0])*20;
                num_flag=0;
                page=0;
            }
        }
        else if(page==12&&num_flag<2)//间歇运动位移设置
        {
            numbuf[num_flag]=Res;
            num_flag++;
            if(num_flag==2)
            {
                distance=(numbuf[1]*256+numbuf[0])*20;
                num_flag=0;
                page=13;
            }
            
        }
        else 
        {
          switch(Res)
            {
                case 0x00:page=0;break;
                case 0x01:page=1;break;
                case 0x02:page=2;break;
                case 0x03:page=3;break;
                case 0x04:page=4;break;
                case 0x05:page=5;break;
                case 0x06:page=6;break;
                case 0x07:page=7;break; 
                case 0x08:page=8;break;
                case 0x09:page=9;break;
                case 0x0a:page=10;break;
                case 0x0b:page=11;break;
                case 0x0c:page=12;break;
                case 0x0e:page=14;break;
                case 0x0f:page=15;break;
                case 0x10:page=16;break;
                case 0x11:page=17;break;
                
            }
        }
  } 

3.其余代码

这个工程是基于正点原子步进电机控制程序的,工程代码我已经打包好上传,有需要的小伙伴可以在评论区留言。


总结:参考+工程代码

参考:步进电机和步进驱动器的介绍、接线、细分和控制方法

工程代码及屏幕设计文件:HMI USART串口屏步进电机控制.zip

你可能感兴趣的:(STM32F407,HMI,USART串口屏,串口通信,stm32,蓝牙,hmi)