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单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

【单片机毕业设计选题24024】-房间自动除湿控制系统

系统功能: 系统分为手动和自动模式,上电默认为自动模式。自动模式下如果获取到湿度 值大于设定的湿度值则自动打开风扇,手动模式下手动开关风扇。 系统上电后显示“欢迎使用除湿控制系统请稍后”,两秒钟后进入主页面显示。 第一行显示系统模式,手动或自动模式 第二行显示获取到的温湿度 第三行显示设置的湿度阈值 第四行显示风扇状态和系统报警状态,风扇状态有开关状态,系统状态和OK和 NG状态。

leetcode刷题(39)——反转链表 II

这道题可以说是非常难的,2中解法,迭代和递归,递归更加难想出来 解法1:迭代链接反转 算法 在看具体算法之前,有必要先弄清楚链接反转的原理以及需要哪些指针。举例而言,有一个三个不同结点组成的链表 A → B → C,需要反转结点中的链接成为 A ← B ← C。 假设我们有两个指针,一个指向结点 A,一个指向结点 B。 分别记为 prev 和 cur。则可以用这两个指针简单地实现 A 和 B

基于51单片机抽奖系统

基于51单片机抽奖系统 (仿真+程序) 功能介绍 具体功能: 1.利用5片74HC495对单片机的IO进行串并转换,进而控制5个1位数码管; 2.采用一个独立按键用于抽奖系统的启停控制; 3.8位拨码开关是用于设定随机数发生器的“种子值”(初始值); ​演示视频: 基于51单片机抽奖系统  添加图片注释,不超过 140 字(可选) 程序 #inclu

江协科技51单片机学习- p16 矩阵键盘

🚀write in front🚀   🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​  💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚  前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (8)软串口与SoftwareSerial库使用 在第六节中我们提到了,如果我们Arduino开发板的0、1号引脚接线了,即硬件串口被占用了,想给Arduino下载程序,就需要先

图像反转入门

文章目录 1.实验目的2.需求3.代码4.运行结果图 1.实验目的 熟练掌握图像像素操作API 2.需求 自己构造一个纯黑图像,通过多种方法进行反转,最终生成一个纯白图像 3.代码 """@Time : 2024/6/23 下午3:46@Author : chensong@File : 自己创建一个图像并反转.py@Desc : """im