微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 用自带驱动控制一个步进电机

用自带驱动控制一个步进电机

时间:10-02 整理:3721RD 点击:

     最近忙活了一下硬件结构,现在继续开始开发。为了节省时间和精力,也是自己驱动渣渣,所以直接用自带的驱动了。主要用到了sprintf(),system()函数以及usleep()函数。
     sprintf()函数原型为int sprintf(char *str, char * format [, argument, ...]),用于将格式化的数据写入字符串,这里是将需要在终端输入的指令写入tmp中。
     system()原型为int system(const char * string),会调用fork()产生子进程,由子进程来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。也就是将上面转换指令为tmp放到后台运行,并能返回现在的程序。
     usleep()原型为void usleep(int micro_seconds),功能为把进程挂起一段时间, 单位是微秒(百万分之一秒)。这个没什么说的。
     然后将GPIO的初始化、释放、方向设置以及压值设置分别做成独立函数,要记得用malloc()后进行free(),之后进行调用就很方便了。
     这是程序在板子上的工作打印内容。
     


     用这块板子控制步进电机很稳,现象如下所示。
    http://v.youku.com/v_show/id_XMTgzMjMxMjYzNg==.html
      程序如下所示。

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include


  12. #define GPIO_OUTPUT 1  //Set the gpio derection output
  13. #define GPIO_INPUT  0  //Set the gpio derection input

  14. #define GPIO_HIGH 1 //Set the gpio output high
  15. #define GPIO_LOW  0  //Set the gpio input low

  16. /**
  17. * @brief: init_GPIO function
  18. * Describe : GPIO_x_y init
  19. * @Param: x:
  20. * @Param: y:
  21. */
  22. void init_GPIO(int x, int y)
  23. {
  24.     char* tmp;
  25.     int gpio;
  26.    
  27.     tmp = (unsigned char*)malloc(64);
  28.     gpio = 32 * x + y;
  29.     sprintf(tmp,"echo %d > /sys/class/gpio/export",gpio);
  30.     printf("GPIO%d_%d init.\n",x, y);
  31.     system(tmp);
  32.     free(tmp);
  33. }

  34. /**
  35. * @brief: release_GPIO function
  36. * Describe : to release GPIO_x_y
  37. * @Param: x:
  38. * @Param: y:
  39. */
  40. void release_GPIO(int x, int y)
  41. {
  42.     char* tmp;
  43.     int gpio;
  44.    
  45.     tmp = (unsigned char*)malloc(64);
  46.     gpio = 32 * x + y;
  47.     sprintf(tmp,"echo %d > /sys/class/gpio/unexport",gpio);
  48.     printf("GPIO%d_%d release.\n",x, y);
  49.     system(tmp);
  50.     free(tmp);
  51. }

  52. /**
  53. * @brief: direction_GPIO function
  54. * Describe : to release GPIO_x_y
  55. * @Param: x:
  56. * @Param: y:
  57. * @Param: n: direction   1:out   0:in
  58. */
  59. void direction_GPIO(int x, int y, int n)
  60. {
  61.     char* tmp;
  62.     int gpio;
  63.    
  64.     tmp = (unsigned char*)malloc(64);
  65.     gpio = 32 * x + y;
  66.     if(n==1){
  67.         sprintf(tmp,"echo 'out' > /sys/class/gpio/gpio%d/direction",gpio);
  68.         printf("The direction of GPIO%d_%d is output.\n",x, y);
  69.     }
  70.    
  71.     if(n==0){
  72.         sprintf(tmp,"echo 'in' > /sys/class/gpio/gpio%d/direction",gpio);
  73.         printf("The direction of GPIO%d_%d is input.\n",x, y);
  74.     }
  75.     system(tmp);
  76.     free(tmp);
  77. }

  78. /**
  79. * @brief: value_GPIO function
  80. * Describe : when the direction of the
  81. * gpio is out, set it's value
  82. * @Param: x:
  83. * @Param: y:
  84. * @Param: n: out value   1:High   0:low
  85. */
  86. void value_GPIO(int x, int y, int n)
  87. {
  88.     char* tmp;
  89.     int gpio;
  90.    
  91.     tmp = (unsigned char*)malloc(64);
  92.     gpio = 32 * x + y;
  93.    
  94.     sprintf(tmp,"echo %d > /sys/class/gpio/gpio%d/value", n, gpio);
  95.     printf("The value of GPIO%d_%d is %d.\n",x, y, n);

  96.     system(tmp);
  97.     free(tmp);
  98. }

  99. //gpio_fd = open("/sys/class/gpio/gpio12/value",O_RDONLY);
  100. /**
  101. * @brief: main function  
  102. * @Param: argc: number of parameters
  103. * @Param: argv: parameters list
  104. */
  105. int main(int argc, char *argv[])
  106. {
  107.         int i =1000;
  108.         printf("hello world ! \n");
  109.         init_GPIO(5,9);
  110.         init_GPIO(5,7);
  111.        direction_GPIO(5,9,GPIO_OUTPUT);
  112.        direction_GPIO(5,7,GPIO_OUTPUT);
  113.         value_GPIO(5,7,GPIO_HIGH);
  114.         while(i>0){
  115.                 value_GPIO(5,9,GPIO_HIGH);
  116.                usleep(10000);  //10ms
  117.                value_GPIO(5,9,GPIO_LOW);
  118.                 usleep(10000);  //10ms
  119.             i--;
  120.         }

  121.         release_GPIO(5,9);
  122.         release_GPIO(5,7);
  123.         return 1;
  124. }

复制代码



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top