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


前言

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

一、效果

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

二、屏幕设计

主界面:

 移动控制界面:

间歇运动界面:

三、部分代码

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

评论 69
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静·无羡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值