STM32输出可控数量与频率的脉冲

发布者:SparkleMagic最新更新时间:2019-05-27 来源: eefocus关键字:STM32输出  频率  脉冲 手机看文章 扫描二维码
随时随地手机看文章

最近在准备电赛做往年的题目,遇到了使用步进电机作为执行器的题目,步进电机有固定的步距角,所以每圈有固定的步数,比如我现在使用的步进电机的步距角为1.8度,所以说转一圈需要走200步,我使用的步进电机驱动器可以进行16细分,这样每转一圈就需要3200步。而这个驱动器使用脉冲来进行控制,每收到一个脉冲就会走一步,所以如果可以每次精确的控制输出的脉冲数,那么在不失步的情况下可以精确控制步进电机转过的角度。


    关于脉冲输出的控制我查阅网上资料后发现有五种方法


    1、单脉冲法,需要一个脉冲中断一次,中断次数多,影响效率


    2、一个定时器输出PWM,另一定时器进行中断计数,与方法1一样,同样需要频繁的中断


    3、用主从定时器门控方式,比较繁琐


    4、用一个定时器(从)作为另一个定时器(主)的外部时钟触发源


    5、高级定时器T1、T8的重复计数方式,RCR计数中断,看手册好像这种方式最简单,能满足一部分人要求,缺点是寄存器只有8位,最多实现255个脉冲计数输出。


    这里我使用了第四个方法。


    pulse.h


#ifndef __PUSEL_H

#define __PUSEL_H

#include "sys.h"

 

void TIM1_config(u32 Cycle);

void TIM2_config(u32 PulseNum);

void Pulse_output(u32 Cycle,u32 PulseNum);

 

 

#endif

 

    pulse.c


#include "pulse.h"

 

 

/***********************TIM1初始化函数*************************/

/****参数:****************************************************/

/******u32 Cycle用于设定计数频率(计算公式:Cycle=1Mhz/目标频率)/

/****返回值:**************************************************/

/******无*****************************************************/

void TIM1_config(u32 Cycle)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //时钟使能

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                   //TIM1_CH4 PA11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    TIM_TimeBaseStructure.TIM_Period = Cycle-1;                 //使用Cycle来控制频率(f=72/(71+1)/Cycle)  当Cycle为100时脉冲频率为10KHZ                           

    TIM_TimeBaseStructure.TIM_Prescaler =71;                    //设置用来作为TIMx时钟频率除数的预分频值                                                     

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS= Tck_tim            

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!(高级定时器特有)

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                       

 

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //选择定时器模式:TIM脉冲宽度调制模式1       

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

    TIM_OCInitStructure.TIM_Pulse = Cycle/2-1;                    //设置待装入捕获寄存器的脉冲值(占空比:默认50%,这可也可以调节如果需要的话将它作为一个参数传入即可)                                   

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      //输出极性       

 

    TIM_OC4Init(TIM1, &TIM_OCInitStructure);        //使能通道4                                                 

 

    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); //设置为主从模式

    TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); //选择定时器1的触发方式(使用更新事件作为触发输出)

    

 

    TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);               //使能通道4预装载寄存器               

    TIM_ARRPreloadConfig(TIM1, ENABLE);                             //使能TIM1在ARR上的预装载寄存器       

}

/***********************TIM2初始化函数*************************/

/****参数:****************************************************/

/******u32 PulseNum用于设定脉冲数量****************************/

/****返回值:*************************************************/

/******无*****************************************************/

void TIM2_config(u32 PulseNum)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure; 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2的时钟

 

    TIM_TimeBaseStructure.TIM_Period = PulseNum-1;    //脉冲数

    TIM_TimeBaseStructure.TIM_Prescaler =0;    

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  

 

    TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); //选择定时器2的输入触发源(内部触发(TIM1))

 

    TIM2->SMCR|=0x07;                                  //设置从模式寄存器(SMS[2:0]:111 外部时钟模式1) 

 

    TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); //更新中断失能

 

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;        

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure); //定时器2中断初始化

}

/************************脉冲输出函数**************************/

/****参数:****************************************************/

/******u32 Cycle用于设定计数频率(计算公式:Cycle=1Mhz/目标频率)/

/******u32 PulseNum用于设定输出脉冲的数量(单位:个)************/

/****返回值:**************************************************/

/******无*****************************************************/

void Pulse_output(u32 Cycle,u32 PulseNum)

{

    TIM2_config(PulseNum); //设置脉冲数量

    TIM_Cmd(TIM2, ENABLE); //使能TIM2(从定时器)

    TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能更新中断

    TIM1_config(Cycle); //使能定时器1(主定时器)

    

    TIM_Cmd(TIM1, ENABLE); //使能定时器1

    TIM_CtrlPWMOutputs(TIM1, ENABLE);    //高级定时器一定要加上,主输出使能

}

 

 

 

/********************定时器2的中断服务函数**********************/

/****参数:****************************************************/

/******u32 PulseNum用于设定脉冲数量****************************/

/****返回值:*************************************************/

/******无*****************************************************/

/****函数说明:************************************************/

/*当TIM的CNT寄存器的值到达设定的Update值会触发更新中断,此时设定的脉冲数已输出完毕,关闭TIM1和TIM2*/

void TIM2_IRQHandler(void) 

    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //TIM_IT_Update

    { 

        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志位 

        TIM_CtrlPWMOutputs(TIM1, DISABLE);  //主输出使能

        TIM_Cmd(TIM1, DISABLE); //关闭定时器 

        TIM_Cmd(TIM2, DISABLE); //关闭定时器 

        TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); //关闭TIM2更新中断

        

    } 

 

    main.c


#include "sys.h"

#include "delay.h"

#include "led.h"

#include "usart.h"

#include "pulse.h"

 

 

int main()

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

delay_init();     //延时函数初始化

uart_init(9600); //9600  

led_init();

while(1)

{

LED=1;

delay_ms(500);

LED=0;

delay_ms(500);

Pulse_output(100,3200);

}

}

 

    脉冲频率10KHz,每经过1s会输出3200个脉冲,步进电机会转1周。


    经过测试,可以快速输出可控频率和数量的脉冲,控制效果也良好,具体实用效果还需要在项目中运用后再更新。


关键字:STM32输出  频率  脉冲 引用地址:STM32输出可控数量与频率的脉冲

上一篇:stm32驱动实例 STM32F10x_StdPeriph_Examples
下一篇:STM32用一个定时器输出多路不同频率及占空比的PWM(输出比较

推荐阅读最新更新时间:2024-11-13 20:48

使用频率域相位测量方法测量器件的电长度
时延特性是器件的重要指标之一,时延特性的精确测量一直是测量领域的热点和难点问题。本文首先提出了一种不同于以往文献的分类方法,将现有的时延测量方法分为时域测量方法和频率域测量方法,并围绕两类方法的特点进行了相关的讨论。 01 时域法测量器件的电长度,矢量网络分析仪仍然进行频率扫描测量,并将频率扫描测量进行傅立叶逆变换,从而得到时间响应测量结果。 以上示例为一端开路的电缆线的频率域与时间域测量显示。频率域显示为幅度参数,其中曲线的波动是由多次反射造成的,这一点可以在右边的时域显示中清楚地看到, ω=2πf,其中S(ω)为矢量网络分析仪频率域测量参数。根据S参数的定义,S=b/a,在归一化校准情况下,我们可以认为a=1,即激
[测试测量]
使用<font color='red'>频率</font>域相位测量方法测量器件的电长度
浅谈PLC控制器频率与伺服驱动器和负载转速
可以看出如果机械结构确定了,这个值也是确定的,1个脉冲对应走的位移是确定的,即系统的精度是确定的。如5mm导程的丝杠,与亿维伺服驱动直接连接的话,精度为5/10000mm。 一、PLC控制器频率与伺服驱动器和负载转速 已知伺服驱动器Pm=10000Pulse/r,PLC控制器发出的频率f (puls/s),如何计算负载轴的转速n(r/s), 当伺服电机直接连接轴,设电子齿轮比分子比分母为N。 n=(f*N)/Pm ...........此公式求出单位为r/s,1s发的脉冲数除以一圈需要的脉冲数=1s转动的圈数。 n :负载转速,单位:r/s。 f:控制器发出的频率,单位:pls/s。 N:驱动器电子齿轮比。 Pm:伺服驱动
[嵌入式]
浅谈PLC控制器<font color='red'>频率</font>与伺服驱动器和负载转速
stm32系统时钟学习笔记
HSE:高速外部时钟 来源:有源晶振(1-50M),无源晶振(4-26M) 控制:RCC_CR时钟控制寄存器的位16:HSEON控制 HSI:高速内部时钟 来源:芯片内部,大小为16M,当HSE故障时,系统自动切换到HSI,直到HSE启动成功 控制:RCC_CR时钟控制寄存器的位0:HSION控制 锁相环时钟:PLLCLK 来源:HSI、HSE。由PLLSRC位配置 HSE或者HSI先经过一个分频因子M进行分频,然后再经过倍频因子N,然后在经过分频因子P,最后成为锁相环时钟 VCOCLK_IN = PLLCLK_IN / M = HSE / 25 = 1M VCOCLK_OUT = VCOCLK_IN * N =1M * 336
[单片机]
<font color='red'>stm32</font>系统时钟学习笔记
电枢检查仪中的同步脉冲发生电路
电枢检查仪中的同步脉冲发生电路
[模拟电子]
电枢检查仪中的同步<font color='red'>脉冲</font>发生电路
伺服电机如何选择脉冲、模拟量、通讯三种控制方式
伺服电机控制方式有脉冲、模拟量和通讯这三种,在不同的应用场景下,我们该如何选择伺服电机的控制方式呢? 一、伺服电机脉冲控制方式 在一些小型单机设备,选用脉冲控制实现电机的定位,应该是常见的应用方式,这种控制方式简单,易于理解。 基本的控制思路:脉冲总量确定电机位移,脉冲频率确定电机速度。选用了脉冲来实现伺服电机的控制,翻开伺服电机的使用手册,一般会有如下这样的表格: 都是脉冲控制,但是实现方式并不一样: 第一种,驱动器接收两路(A、B路)高速脉冲,通过两路脉冲的相位差,确定电机的旋转方向。如上图中,如果B相比A相快90度,为正转;那么B相比A相慢90度,则为反转。 运行时,这种控制的两相脉冲为交替状,因此
[嵌入式]
伺服电机如何选择<font color='red'>脉冲</font>、模拟量、通讯三种控制方式
带通滤波器的频率介绍
带通滤波器是指能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。一个模拟带通滤波器的例子是电阻-电感-电容电路(RLC circuit)。这些滤波器也可以用低通滤波器同高通滤波器组合来产生。 一个理想的带通滤波器应该有一个完全平坦的通带,在通带内没有放大或者衰减,并且在通带之外所有频率都被完全衰减掉,另外,通带外的转换在极小的频率范围完成。    实际上,并不存在理想的带通滤波器。滤波器并不能够将期望频率范围外的所有频率完全衰减掉,尤其是在所要的通带外还有一个被衰减但是没有被隔离的范围。这通常称为滤波器的滚降现象,并且使用每十倍频的衰减幅度的dB数来表示。 通常,
[测试测量]
几种60HZ脉冲发生器电路
60HZ脉冲发生器电路 几种60H脉冲发生器电路 附图1电路是由12为二进制串行计数器/分频器CD4040和六反相器CD4069等构成的60Hz数字钟时基电路。 电路中,CD4069的门I和门II构成震荡频率为32768Hz的晶体振荡器。其输出经CD4069的门III整形后送至CD4040的 端。CD4040的输出由二极管VD1~VD3置成分频系数为21+25+29=546,经分频后在输出端Q9上便可输出一个60Hz的时钟信号供给数字钟集成电路。图2a是另一种60Hz脉冲发生电路。它由集成电路CD4060和谐振频率为30720Hz的晶振等元件组成。CD4060是14位二进制串行计数、分频器和振荡器。CD4060内部分为两
[模拟电子]
几种60HZ<font color='red'>脉冲</font>发生器电路
基于LabVIEW的虚拟信号发生器实现脉冲和过渡过程测量系统的设计
1、 引言 虚拟仪器VI(Visual Instrument)是以计算机强大的软硬件资源作为仪器的支撑,利用高性能的模块化硬件,结合高效灵活的软件组成,完成各种测试、测量和自动化应用的各种各样的仪器系统。随着计算机网络的发展,虚拟仪器与网络技术的结合为虚拟仪器网络化提供了良好的实现平台。LabVIEW(Laboratory Virtual instrument Engineering)是目前在虚拟仪器中使用较为广泛的罔形化设计语言,它对软件对象“虚拟仪器”进行图形化的组合操作。 2 、虚拟仪器介绍 虚拟仪器是基于计算机的仪器,以通用的计算机硬件及操作系统为依托,实现各种仪器功能。常见的虚拟仪器结构框图如图1所示。 LabV
[测试测量]
基于LabVIEW的虚拟信号发生器实现<font color='red'>脉冲</font>和过渡过程测量系统的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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