找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2051|回复: 1
打印 上一主题 下一主题
收起左侧

STM32调节步进电机源程序

[复制链接]
跳转到指定楼层
楼主
ID:256683 发表于 2018-8-17 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于STM32步进电机调节

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "master_slave.h"  
  6. #include "stm32f10x_tim.h"
  7. //#include "key.h"
  8. //#include "timer.h"
  9. int main(void)
  10. {               

  11.         delay_init();                     //延时函数初始化          
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  13.         uart_init(115200);         //串口初始化为115200
  14.         LED_Init();                             //LED端口初始化

  15.            LED0=0;         
  16.    TIM3_CH1_init();
  17.          delay_ms(200);
  18.          
  19.          
  20.            while(1)
  21.         {
  22.                          LED0=1;       
  23.                    TIM2_TIM3_PWM(2000, 12);   //每次少10个脉冲   
  24.                    delay_ms(200);
  25.                
  26.              LED0=0;       
  27.                    TIM2_TIM3_PWM(2000, 25);   //每次少10个脉冲                       
  28.                    delay_ms(250);
  29.                
  30.              LED0=1;       
  31.                    TIM2_TIM3_PWM(2000, 16);   //每次少10个脉冲                       
  32.                    delay_ms(100);
  33.                
  34.              LED0=0;       
  35.                    TIM2_TIM3_PWM(2000, 35);   //每次少10个脉冲                       
  36.                    delay_ms(150);
  37.                
  38.         }
  39. }

复制代码
  1. #include "master_slave.h"  
  2. #include "stm32f10x.h"

  3. /**TIM2的通道1 使用单脉冲模式    TIM2_ch1_ETR:A0
  4. **TIM3使用门控模式输出PWM       TIM3_ch1    :A6

  5. TIM2per、TIM3per: ARR重装值   (无关紧要,后面会在此赋值)
  6. Compare1: 比较捕获1的预装载值 (固定占空比所以,所以此参数不要了)           */


  7. void Motor_Init(u16 TIM2per, u16 TIM3per)
  8. {

  9.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  10.   TIM_OCInitTypeDef TIM_OCInitStruct;
  11.   GPIO_InitTypeDef GPIO_InitStruct;

  12.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE);   // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                        
  13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);


  14.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;   //TIM2_ch1_ETR:A0   ,  TIM3_ch1    :A6
  15.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6;
  16.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  17.   GPIO_Init(GPIOA,&GPIO_InitStruct);

  18.   
  19.   /**************TIM2工作在单脉冲模式下********************/
  20.   TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  21.   TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  22.   TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;   //预分配值,每100u计数一次
  23.   TIM_TimeBaseInitStruct.TIM_Period = TIM2per;   //重载值
  24.   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);


  25.   TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式下 , 单次触发
  26.   TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);// 使能TIM2的通道1预装载寄存器
  27.   TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //脉冲输出通道1


  28.   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//
  29.   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
  30.   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  31.   TIM_OCInitStruct.TIM_Pulse = TIM2per/2;//比较捕获1的预装载值    占空比50%
  32.   TIM_OC1Init(TIM2,&TIM_OCInitStruct);

  33.   TIM_Cmd(TIM2,DISABLE);//先不使能TIM2


  34. /****************TIM3再从模式的门控模式下的PWM输出模式**************/
  35.   TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  36.   TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  37.   TIM_TimeBaseInitStruct.TIM_Prescaler = 720;//预分频值,10us技术一次
  38.   TIM_TimeBaseInitStruct.TIM_Period = TIM3per;//重载值
  39.   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

  40.   
  41.   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式
  42.   TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
  43.   TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部从TIM2触发
  44.   

  45.   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
  46.   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
  47.   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  48.   TIM_OCInitStruct.TIM_Pulse = TIM3per/2;//比较捕获1的预装载值   占空比50%
  49.   TIM_OC1Init(TIM3,&TIM_OCInitStruct);

  50.   TIM_Cmd(TIM3,ENABLE);

  51. }





  52. /*****设置PWM的输出,精确输出多少频率多少个数的脉冲************/

  53. /*****Cycle:周期,单位(us)
  54. ******Pulse_Num:脉冲个数(最大3200)

  55. ****改变TIM3的 ( 重装载值          ) 改变脉冲频率,固定占空比为50%
  56. ****改变TIM2的 ( 预分频器+重装载值 ) 改变脉冲个数                    */

  57. void TIM2_TIM3_PWM(u16 Cycle, u16 Pulse_Num)
  58. {
  59.   u16 TIM3per = 0;        
  60.   u32 Time = 0;

  61.   Time = Cycle * Pulse_Num;
  62.   Time /= 100;                  //预分频为7200,100us 技术一次
  63.   TIM3per = Cycle/10;           //预分频为720 ,10us  技术一次

  64.   TIM_SetAutoreload(TIM2, Time-1);     //设置TIM2的重装载值
  65.   TIM_SetAutoreload(TIM3, TIM3per-1);  //设置TIM3的重装载值
  66.   TIM_SetCompare1(TIM3,TIM3per/2);     //设置TIM3占空比为50%

  67.   TIM_Cmd(TIM2,ENABLE);

  68. }

  69. void TIM3_CH1_init(void)
  70. {
  71.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  72.   TIM_OCInitTypeDef TIM_OCInitStruct;
  73.   GPIO_InitTypeDef GPIO_InitStruct;

  74.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3,ENABLE);   // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                        
  75.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);


  76.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;   //TIM2_ch1_ETR:A0   ,  TIM3_ch1    :A6
  77.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6;
  78.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  79.   GPIO_Init(GPIOA,&GPIO_InitStruct);

  80.   
  81.   /**************TIM2工作在单脉冲模式下********************/
  82.   TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  83.   TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  84.   TIM_TimeBaseInitStruct.TIM_Prescaler = 7200;   //预分配值,每100u计数一次
  85.   TIM_TimeBaseInitStruct.TIM_Period = 400;   //重载值
  86.   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);


  87.   TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//设置TIM2在单脉冲模式下 , 单次触发
  88.   TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);// 使能TIM2的通道1预装载寄存器
  89.   TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //脉冲输出通道1


  90.   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//
  91.   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
  92.   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  93.   TIM_OCInitStruct.TIM_Pulse = 200;//比较捕获1的预装载值    占空比50%
  94.   TIM_OC1Init(TIM2,&TIM_OCInitStruct);

  95.   TIM_Cmd(TIM2,DISABLE);//先不使能TIM2


  96. /****************TIM3再从模式的门控模式下的PWM输出模式**************/
  97.   TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  98.   TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  99.   TIM_TimeBaseInitStruct.TIM_Prescaler = 720;//预分频值,10us技术一次
  100.   TIM_TimeBaseInitStruct.TIM_Period = 200;//重载值
  101.   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

  102.   
  103.   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);//TIM3为门控模式
  104.   TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
  105.   TIM_SelectInputTrigger(TIM3,TIM_TS_ITR1);//内部从TIM2触发
  106.   

  107.   TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;
  108.   TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
  109.   TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  110.   TIM_OCInitStruct.TIM_Pulse = 100;   //比较捕获1的预装载值   占空比50%
  111.   TIM_OC1Init(TIM3,&TIM_OCInitStruct);

  112.   TIM_Cmd(TIM3,ENABLE);
  113. }









  114. void Set_F_Pulse_Num(u16 Cycle, u16 Pulse_Num)
  115. {


  116. }

复制代码


所有资料51hei提供下载:
频率 脉冲可控,驱动步进电机.rar (2.19 KB, 下载次数: 19)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-8-18 01:20 | 只看该作者
此贴补全原理图即可获得100积分
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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