极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17164|回复: 5

求高手指導, Timer1出脈沖, 加入方向(正/ 反) 和 步數的控制程序

[复制链接]
发表于 2016-10-6 15:28:57 | 显示全部楼层 |阅读模式
求高手指導,  如何在以下定时器中断翻转数字IO程式中(输出方波),加入方向(正/反) 和 步數的控制程序

程序如下:                  

#include <TimerOne.h>
void setup()
  {
  pinMode(13, OUTPUT);
  Timer1.initialize(100000);   //设置定时器中断时间,基本单位为微秒,如设置为100000,则定时时间为0.1秒,频率为10Hz。
  Timer1.attachInterrupt(timerIsr ); // 设置用户自定义的定时器中断服务函数,每发生一次定时器中断,均会执行一次定时器中断服务函数。
  }

void loop()
{
//主函数,用于执行非周期性任务
}

void timerIsr()
    {     // 反转I/O口电平
    digitalWrite( 13,digitalRead( 13 ) ^ 1 );
    }

    謝謝
回复

使用道具 举报

发表于 2016-10-6 19:58:11 | 显示全部楼层
你的问题我都没理解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-7 09:03:24 | 显示全部楼层
我想用Timer1出脈沖經控制器來推動步進電機, 因轉速可更快. 但不知道如何加入"方向"和"步數"設定于程序中, 求教
回复 支持 反对

使用道具 举报

发表于 2016-10-8 09:24:10 | 显示全部楼层
timer 用来产生脉冲,方向和步数就要从loop里面来做,有相应的条件,就改变方向和步数。loop加上if之类的语句就行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-8 10:29:39 | 显示全部楼层
謝164335413的指導, 那步數是否用FOR命令作控制呢 ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-13 15:49:39 | 显示全部楼层
程序試寫了, 但用了delay控制步數有點怪怪的, 有更好方法嗎 ?

#include <TimerOne.h>

//针脚定义
const int pul_pin_x = 2;//X轴脉冲驱动口
const int dir_pin = 5;//方向控制
const int ena_pin = 8;//释放电机

boolean output =LOW;//脉冲方波状态
boolean dir = LOW;//方向状态
boolean ena = LOW;//释放电机锁死状态

/*---------=============函数定义==============----------*/

void wave_x()  //摇杆x轴脉冲输出程序
{
    output = !output;
    digitalWrite(pul_pin_x,output);        
}

void wave_stop() //脉冲停止程序
{
    Timer1.stop();
    output = LOW;
    digitalWrite(pul_pin_x,output);
}

/*-----------============参数设置=============-------------*/

void setup()
{
  /*输出端口配置*/
  pinMode(pul_pin_x,OUTPUT);
  pinMode(dir_pin,OUTPUT);
  pinMode(ena_pin,OUTPUT);
  
  /*输入端口配置 */
  pinMode(9, INPUT);
  
  /*端口初始化 */
  digitalWrite(pul_pin_x,LOW);
  digitalWrite(dir_pin,LOW);
  digitalWrite(ena_pin,LOW);

  Timer1.stop();  
}

/*-----------=============主函数循环体=============-----------*/

void loop()
{
  if(digitalRead( 9 ) == HIGH)  // 檢查按鍵
  {
    for (int i=0; i < 630; i++ ) //反轉2圈
   {
    digitalWrite(dir_pin, HIGH);   
    Timer1.initialize(50);
    Timer1.attachInterrupt(wave_x);
    delay (1);
   }
   
   wave_stop();
   delay (1000);      //停1秒
   
    for (int i=0; i < 630; i++ )   //正轉2圈
   {
    digitalWrite(dir_pin, LOW);   
    Timer1.initialize(50);
    Timer1.attachInterrupt(wave_x);
    delay (1);
   }
   wave_stop();
   
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 16:37 , Processed in 0.058591 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表