PIC单片机-步进电机的正转与反转

2023-12-24 00:08

本文主要是介绍PIC单片机-步进电机的正转与反转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PIC步进电机原理图:PIC单片机步进电机原理图

一、步进电机单双八拍正转

步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件。步进电动机的输入量是脉冲序列,输出量则为相应的增量位移或步进运动。正常运动情况下,它每转一周具有固定的步数;做连续步进运动时,其旋转转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。

本程序采用单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)。

如要实现电机反转,只要更改脉冲方向即可。可更改为:D-CD-C-BC-B-AB-A-DA。

#include <htc.h>#define uint8 unsigned char
#define uint16 unsigned int__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset#define F1  RB5
#define F2  RB4
#define F3  RB3
#define F4  RB2/***************************定义全局变量***************************************/#define Speed  2		//速度,可以调节
volatile uint8 MotorStep = 0,count =0,coun =0 ;
volatile uint8 time_flag = 0;/***************************函数声明***************************************/
void SetMotor(void);
void InitMotor(void);/*******************************************************************************
* 函 数 名: InitMotor(void
* 函数功能: 马达初始化
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void InitMotor(void)
{
	F1 = 1;
	F2 = 1;
	F3 = 1;
	F4 = 1;
}/*******************************************************************************
* 函 数 名: SetMotor(void)
* 函数功能: 马达八拍运行
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void SetMotor(void)
{
	switch(MotorStep)
    {
       	case 0:   		// A
				if(time_flag)
				{
		            F1 = 0;		    
		            F2 = 1;
					F3 = 1;
		            F4 = 1;
		            MotorStep = 1;
					time_flag = 0;
				}
       			break;
       	case 1:		 	// AB	
				if(time_flag ==1)
				{
		            F1 = 0;		    
		            F2 = 0;
					F3 = 1;
		            F4 = 1;
		            MotorStep = 2;
					time_flag = 0;
				}
       			break;       	case 2:	   		//B
				if(time_flag ==1)
				{
		            F1 = 1;		 
		            F2 = 0;
					F3 = 1;
		            F4 = 1;
		            MotorStep = 3;
					time_flag = 0;
				}
				break;
       	case 3:			//BC
				if(time_flag ==1)
				{
		            F1 = 1;	 
		            F2 = 0;
					F3 = 0;
		            F4 = 1;
		            MotorStep = 4;
					time_flag = 0;
				}
       			break;
     	case 4:		 	//C	
				if(time_flag ==1)
				{
		            F1 = 1;	 
		            F2 = 1;
					F3 = 0;
		            F4 = 1;
		            MotorStep = 5;
					time_flag = 0;
				}
	       		break;
		case 5:			  	//CD	
				if(time_flag ==1)
				{
		            F1 = 1;	 
		            F2 = 1;
					F3 = 0;
		            F4 = 0;
		            MotorStep = 6;
					time_flag = 0;
				}
				break;
		case 6:			  	//D	
				if(time_flag ==1)
				{
		            F1 = 1;	 
		            F2 = 1;
					F3 = 1;
		            F4 = 0;
		            MotorStep = 7;
					time_flag = 0;
				}
	      		break;
		case 7:				//DA
				if(time_flag ==1)
				{
		            F1 = 0;	 
		            F2 = 1;
					F3 = 1;
		            F4 = 0;
		            MotorStep = 0;
					time_flag = 0;
					coun++;
					if(coun>= 64)
					{
						coun = 0;
					}	
				}
	       		break;
		default:break;
	}
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 单双八拍
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void main()
{	
	TRISB = 0x00;
	T1CON = 0x08;
	TMR1H = (65535-5*500)/256;		//65535-500*5    0.5毫秒延时
	TMR1L = (65535-5*500)%256;
	TMR1IE = 1;
	TMR1IF = 0;
	PEIE = 1;
	GIE = 1;
	TMR1ON = 1;
	InitMotor();
	while(1)
	{
		SetMotor();
	}	
}/******************************************************************************
* 函 数 名: interrupt Capture(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void interrupt ISR(void)
{
	if(TMR1IF == 1)
	{
		TMR1ON = 0;
		TMR1IE = 0;
		TMR1IF = 0;
		count++;
		if(count >= Speed)
		{
			time_flag = 1;
			count = 0;	
		}
		TMR1H = (65535-5*500)/256;
		TMR1L = (65535-5*500)%256;
		TMR1IE = 1;
		TMR1ON = 1;
	}
}
 二、实现步进电机的反转
#include <htc.h>#define uint8 unsigned char
#define uint16 unsigned int__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位
//WDTE_OFF:disable watchdog timer       看门狗禁止
//LVP_OFF:low voltage programming disabled  低电压编程禁止
//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out reset#define F1  RB2
#define F2  RB3
#define F3  RB4
#define F4  RB5/***************************定义全局变量***************************************/#define  Speed 2        //速度,可以调节
volatile uint8 MotorStep = 0, count = 0 ;
volatile uint8 time_flag = 0;/***************************函数声明***************************************/
void SetMotor(void);
void InitMotor(void);/*******************************************************************************
* 函 数 名: InitMotor(void
* 函数功能: 马达初始化
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void InitMotor(void)
{
    F1 = 1;
    F2 = 1;
    F3 = 1;
    F4 = 1;
}/*******************************************************************************
* 函 数 名: SetMotor(void)
* 函数功能: 马达八拍运行
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void SetMotor(void)
{
    switch(MotorStep)
    {
    case 0:         // D
        if(time_flag)
        {
            F1 = 0;
            F2 = 1;
            F3 = 1;
            F4 = 1;
            MotorStep = 1;
            time_flag = 0;
        }
        break;
    case 1:         // CD
        if(time_flag == 1)
        {
            F1 = 0;
            F2 = 0;
            F3 = 1;
            F4 = 1;
            MotorStep = 2;
            time_flag = 0;
        }
        break;    case 2:         //CC
        if(time_flag == 1)
        {
            F1 = 1;
            F2 = 0;
            F3 = 1;
            F4 = 1;
            MotorStep = 3;
            time_flag = 0;
        }
        break;
    case 3:         // BC
        if(time_flag == 1)
        {
            F1 = 1;
            F2 = 0;
            F3 = 0;
            F4 = 1;
            MotorStep = 4;
            time_flag = 0;
        }
        break;
    case 4:         // B
        if(time_flag == 1)
        {
            F1 = 1;
            F2 = 1;
            F3 = 0;
            F4 = 1;
            MotorStep = 5;
            time_flag = 0;
        }
        break;
    case 5:             // AB
        if(time_flag == 1)
        {
            F1 = 1;
            F2 = 1;
            F3 = 0;
            F4 = 0;
            MotorStep = 6;
            time_flag = 0;
        }
        break;
    case 6:             // A
        if(time_flag == 1)
        {
            F1 = 1;
            F2 = 1;
            F3 = 1;
            F4 = 0;
            MotorStep = 7;
            time_flag = 0;
        }
        break;
    case 7:             // DA
        if(time_flag == 1)
        {
            F1 = 0;
            F2 = 1;
            F3 = 1;
            F4 = 0;
            MotorStep = 0;
            time_flag = 0;
        }
        break;
    default:
        break;
    }
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 单双八拍
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void main()
{
    TRISB = 0x00;
    T1CON = 0x08;
    TMR1H = (65535 - 5 * 500) / 256;        //65535-500*5    0.5毫秒延时
    TMR1L = (65535 - 5 * 500) % 256;
    TMR1IE = 1;
    TMR1IF = 0;
    PEIE = 1;
    GIE = 1;
    TMR1ON = 1;
    InitMotor();
    while(1)
    {
        SetMotor();
    }
}/******************************************************************************
* 函 数 名: interrupt Capture(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返    回: 无
*******************************************************************************/void interrupt ISR(void)
{
    if(TMR1IF == 1)
    {
        TMR1ON = 0;
        TMR1IE = 0;
        TMR1IF = 0;
        count++;
        if(count >= Speed)
        {
            time_flag = 1;
            count = 0;
        }
        TMR1H = (65535 - 5 * 500) / 256;
        TMR1L = (65535 - 5 * 500) % 256;
        TMR1IE = 1;
        TMR1ON = 1;
    }
}

这篇关于PIC单片机-步进电机的正转与反转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529937

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

MapReduce算法 – 反转排序(Order Inversion)

译者注:在刚开始翻译的时候,我将Order Inversion按照字面意思翻译成“反序”或者“倒序”,但是翻译完整篇文章之后,我感觉到,将Order Inversion翻译成反序模式是不恰当的,根据本文的内容,很显然,Inversion并非是将顺序倒排的意思,而是如同Spring的IOC一样,表明的是一种控制权的反转。Spring将对象的实例化责任从业务代码反转给了框架,而在本文的模式中,在map