STM32控制步进电机源代码

发布者:BlissfulDreams最新更新时间:2020-07-12 来源: 51hei关键字:STM32控制  步进电机  计数器 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "misc.h"


void RCC_Configuration(void);

void GPIO_Configuration(void);

void ZhengZhuan(u16 tt);

void FanZhuan(u16 tt);

void delay_ms(u16 nms);


/****************************************************************************

* 名    称:int main(void)

* 功    能:主函数

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无

****************************************************************************/

int main(void)

{

  RCC_Configuration();        //系统时钟设置及外设时钟使能                  

  GPIO_Configuration();


  while (1)

  {       

          //读取PC5管脚的输入状态         K1  

        if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET)

        {

                ZhengZhuan(5);//高速

        }


        //读取PC5管脚的输入状态           K2

        if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == Bit_RESET)

        {

                FanZhuan(5);//高速

        }       


        //读取PC2管脚的输入状态            K3

        if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == Bit_RESET)

        {

                ZhengZhuan(10);//低速

        }


        //读取PC3管脚的输入状态            K4

        if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) == Bit_RESET)

        {

                FanZhuan(10);//低速

        }


          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_ResetBits(GPIOD, GPIO_Pin_12);

          GPIO_ResetBits(GPIOE, GPIO_Pin_4);

  }

}


/****************************************************************************

* 名    称:void RCC_Configuration(void)

* 功    能:系统时钟配置为72MHZ, 外设时钟配置

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无

****************************************************************************/

void RCC_Configuration(void)

{

  SystemInit();

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE , ENABLE);

}


/****************************************************************************

* 名    称:void GPIO_Configuration(void)

* 功    能:LED控制口线及键盘设置

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无

****************************************************************************/

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;                                //端口配置结构体


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                        //PD3管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz

  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口       


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                        //PD6管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz

  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口       


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                //PD12管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz

  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口       


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                        //PE4管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz

  GPIO_Init(GPIOE, &GPIO_InitStructure);                        //初始化端口       



  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                        //PC5管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //输入上拉

  GPIO_Init(GPIOC, &GPIO_InitStructure);                        //初始化端口


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                        //PC1管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //输入上拉

  GPIO_Init(GPIOC, &GPIO_InitStructure);                        //初始化端口


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                        //PC2管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //输入上拉

  GPIO_Init(GPIOC, &GPIO_InitStructure);                        //初始化端口


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                        //PC3管脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                //输入上拉

  GPIO_Init(GPIOC, &GPIO_InitStructure);                        //初始化端口

}

//电机正转函数

void ZhengZhuan(u16 tt)

{

            //1100

          GPIO_SetBits(GPIOD, GPIO_Pin_3);

          GPIO_SetBits(GPIOD, GPIO_Pin_6);

          GPIO_ResetBits(GPIOD, GPIO_Pin_12);

          GPIO_ResetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

          //0110  

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_SetBits(GPIOD, GPIO_Pin_6);

          GPIO_SetBits(GPIOD, GPIO_Pin_12);

          GPIO_ResetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

          //0011

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_SetBits(GPIOD, GPIO_Pin_12);

          GPIO_SetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

          //1001          

          GPIO_SetBits(GPIOD, GPIO_Pin_3);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_ResetBits(GPIOD, GPIO_Pin_12);

          GPIO_SetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

}

//电机反转函数

void FanZhuan(u16 tt)

{

          //1001          

          GPIO_SetBits(GPIOD, GPIO_Pin_3);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_ResetBits(GPIOD, GPIO_Pin_12);

          GPIO_SetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

          //0011

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_ResetBits(GPIOD, GPIO_Pin_6);

          GPIO_SetBits(GPIOD, GPIO_Pin_12);

          GPIO_SetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);          

          //0110

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);

          GPIO_SetBits(GPIOD, GPIO_Pin_6);

          GPIO_SetBits(GPIOD, GPIO_Pin_12);

          GPIO_ResetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);

          //1100

          GPIO_SetBits(GPIOD, GPIO_Pin_3);

          GPIO_SetBits(GPIOD, GPIO_Pin_6);

          GPIO_ResetBits(GPIOD, GPIO_Pin_12);

          GPIO_ResetBits(GPIOE, GPIO_Pin_4);

          delay_ms(tt);          

}


void delay_ms(u16 nms)

{

         u32 temp;

         SysTick->LOAD = 9000*nms;

         SysTick->VAL=0X00;//清空计数器

[1] [2]
关键字:STM32控制  步进电机  计数器 引用地址:STM32控制步进电机源代码

上一篇:STM32蜂鸣器模拟播放歌曲
下一篇:STM32双定时器测频率源程序

推荐阅读最新更新时间:2024-11-10 18:20

STM32中NVIC(嵌套向量中断控制)的理解
NVIC,中文名嵌套中断向量控制器,是Cortex-M3系列控制器内部独有集成单元,与CPU结合紧密,降低中断延迟时间并且能更加高效处理后续中断。举个例子,比如火车站买票,那些火车站的规章制度就是NVIC,规定学生和军人有比一般人更高优先级,它们则给你单独安排个窗口,同学与同学之间也有区别,那就是你也得排队,也就是你的组别(抢断优先级)和你的排队序号(响应优先级)决定你何时能买到票。 抢断优先级,顾名思义,能再别人中断是抢占别人中断,实现中断嵌套。响应优先级则只能排队,不能抢在前面插别人的对,即不能嵌套。 STM32中指定优先级的寄存器为4位,其定义如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于
[单片机]
单片机对仪表步进电机的细分控制
  仪表步进电机   步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机某相线圈加一脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得在速度、位置等控制领域用步进电机来控制变得非常简单。虽然步进电机已被广泛地应用,但步进电机并不像普通的直流电机、交流电机那样在常规下使用。它必须在双环形脉冲信号、功率驱动电路等组成控制系统下使用。   仪表步进电机属于步进电机中体积、功耗较小的类别,可以由单片机或专用芯片的引脚直接驱动,不需外接驱动器,因而在仪表中被用于指针的旋转控制。
[单片机]
单片机对仪表<font color='red'>步进电机</font>的细分<font color='red'>控制</font>
平凡的单片机--用单片机控制步进电机
步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 一、步进电机常识 常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度 或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反
[单片机]
平凡的单片机--用单片机<font color='red'>控制</font><font color='red'>步进电机</font>
STM32学习14:EXTI(外部中断事件控制器)
EXTI管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 编程思路: 1、配置NVIC。初始化NVIC(实现过程:先初始化NVIC结构体,再写NVICInit()函数)。 2、配置按键中断。在这个函数中,因为我们要使用IO口作为中断输入, 所以第一步我们要使能相应的IO时钟。(因为GPIO 和中断线映射关系是在寄存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我们要配置外部中断,还需要打开 SYSCFG 时钟。)第二步,初始
[单片机]
<font color='red'>STM32</font>学习14:EXTI(外部中断事件<font color='red'>控制</font>器)
PIC16C7XX的A/D片内RC振荡器能否用于计数器
16C71A/D转换器片内RC振荡器的作用是让MCU处于睡眠时(此时主振停振)能有一个时钟源来进行A/D转换。此RC振荡器因其内部设计的限制不能被其他电路使用。 A/D转换器内部RC振荡器钟频典型值为250K,但会随着环境温度,工作电压,产品批号等不同而有相当的变动。 定时器的时钟源可以选择内部的振荡频率,也可以是外部的脉冲输入信号。若你能选择后者,那就能方便地做到MCU的主频很高而时钟的溢出率较低。不然,除了用软件来计数分频,好象也没有其它招数。 另一种选择是用其它型号的MCU,其内部至少还另有一个TIMER1,因为TIMER1可以有独立的一颗晶体作为时钟振荡的基准,你可以方便地选用频率低的晶体来完成你的设计。
[单片机]
四相步进电机proteus仿真及程序
#include regx51.h #define forward P2_0 #define backward P2_1 #define bujinjia P2_2 #define bujinjian P2_3 #define jiasu P2_6 #define jiansu P2_5 #define stop P2_4 static unsigned int k=0; static unsigned int j=0; code char fward ={0x33,0x99,0xcc,0x66}; code char bward ={0x99,0x33,0x66,0xcc}; unsigned char timer0_tic
[单片机]
四相<font color='red'>步进电机</font>proteus仿真及程序
让 28BYJ-48 步进电机转起来
再重新看一下上面的步进电机外观图和内部结构图:步进电机一共有5根引线,其中红色的是公共端,连接到 5 V 电源,接下来的橙、黄、粉、蓝就对应了 A、B、C、D 相;那么如果要导通 A 相绕组,就只需将橙色线接地即可,B 相则黄色接地,依此类推;再根据上述单四拍和八拍工作过程的讲解,可以得出下面的绕组控制顺序表,如表9-1所示: 我们板子上控制步进电机部分是和板子上的显示控制的 74HC138 译码器部分复用的 P1.0~P1.3,关于跳线我们在第3章已经讲过了,通过调整跳线帽的位置可以让 P1.0~P1.3控制步进电机的四个绕组,如图9-5所示。 图9-5 显示译码与步进电机的选择跳线 如果要使用电机的话,需要把4个跳线帽
[单片机]
让 28BYJ-48 <font color='red'>步进电机</font>转起来
怎样用STM32单片机的GPIO控制LED显示状态
用STM32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态。 ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只写寄存器:[color=Red]既能控制管脚为高电平,也能控制管脚为低电平。 对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。 刚开始或许你跟我一样有以下疑惑: 1.既然ODR 能控制管脚高低电平为什么还需
[单片机]
怎样用<font color='red'>STM32</font>单片机的GPIO<font color='red'>控制</font>LED显示状态
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved