搜索
bottom↓
回复: 2

STM32F103VE使用TIM1和TIM8两个定时器为什么TIM8有输出TIM1没有?

[复制链接]

出0入0汤圆

发表于 2016-10-10 19:31:43 | 显示全部楼层 |阅读模式
  1. #include <delay.h>
  2. #include <driver.h>
  3. #include <usart.h>

  4. //////////////////////////////////////////////////////////////////////////////////         
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  6. //此例程有参考论坛网友例程的一部分(http://www.openedv.com/thread-41832-1-1.html)
  7. //ALIENTEK战舰STM32开发板
  8. //步进电机驱动器 测试代码                          
  9. //lycreturn@ALIENTEK
  10. //技术论坛:www.openedv.com
  11. //修改日期:2016/05/12
  12. //版本:V1.0
  13. //版权所有,盗版必究。
  14. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  15. //All rights reserved       
  16. //********************************************************************************
  17. //修改日期:2016/05/12
  18. //////////////////////////////////////////////////////////////////////////////////
  19. /********** 驱动器 端口定义 **************
  20. //DRIVER_DIR   PC0
  21. //DRIVER_OE    PC2
  22. //STEP_PULSE   PC7 (TIM8_CH2,LCD_RW)
  23. ******************************************/

  24. u8 rcr_remainder;   //重复计数余数部分
  25. u8 is_rcr_finish=1; //重复计数器是否设置完成
  26. long rcr_integer;        //重复计数整数部分
  27. long target_pos=0;  //有符号方向
  28. long current_pos=0; //有符号方向
  29. DIR_Type motor_dir=CW;//顺时针

  30. /************** 驱动器控制信号线初始化 ****************/
  31. void Driver_Init(void)
  32. {
  33.         GPIO_InitTypeDef  GPIO_InitStructure;

  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);        //使能PC端口时钟

  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;        //PC0.2 端口配置
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //IO口速度为50MHz
  38.         GPIO_Init(GPIOC, &GPIO_InitStructure);                                        //根据设定参数初始化GPIOC
  39.         GPIO_SetBits(GPIOC,GPIO_Pin_8);                                                         //PC0输出高 顺时针方向  DRIVER_DIR
  40.         GPIO_ResetBits(GPIOC,GPIO_Pin_9);                                                //PC2输出低 使能输出  DRIVER_OE
  41.        
  42.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;        //PC0.2 端口配置
  43.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出
  44.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //IO口速度为50MHz
  45.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        //根据设定参数初始化GPIOC
  46.         GPIO_SetBits(GPIOA,GPIO_Pin_4);                                                         //PC0输出高 顺时针方向  DRIVER_DIR
  47.         GPIO_ResetBits(GPIOA,GPIO_Pin_5);                                                //PC2输出低 使能输出  DRIVER_OE
  48. }
  49. /***********************************************
  50. //TIM1_CH2(PA1) 单脉冲输出+重复计数功能初始化
  51. //TIM1 时钟频率 72MHz
  52. //arr:自动重装值
  53. //psc:时钟预分频数
  54. ************************************************/
  55. void TIM1_OPM_RCR_Init(u16 arr,u16 psc)
  56. {                                                          
  57.         GPIO_InitTypeDef GPIO_InitStructure;
  58.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  59.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  60.         NVIC_InitTypeDef NVIC_InitStructure;

  61.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM8时钟使能
  62.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIOC外设时钟使能                                                                                      

  63.   //设置该引脚为复用输出功能,输出TIM8 CH2的PWM脉冲波形
  64.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM1_CH1
  65.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  66.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  68.        
  69.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  70.        
  71.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         
  72.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  
  73.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  74.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  75.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  76.         TIM_ClearITPendingBit(TIM1,TIM_IT_Update);

  77.         TIM_UpdateRequestConfig(TIM1,TIM_UpdateSource_Regular); /********* 设置只有计数溢出作为更新中断 ********/
  78.         TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);/******* 单脉冲模式 **********/

  79.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  80.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出2使能
  81.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; /****** 比较输出2N失能 *******/
  82.         TIM_OCInitStructure.TIM_Pulse = arr>>1; //设置待装入捕获比较寄存器的脉冲值
  83.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  84.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  85.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH2预装载使能         
  86.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  87.        
  88.         TIM_ITConfig(TIM1, TIM1_UP_IRQn ,ENABLE);  //TIM1   使能或者失能指定的TIM中断

  89.         NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM1中断
  90.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级1级
  91.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
  92.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  93.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  94.        
  95.         TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源
  96. //        TIM_CtrlPWMOutputs(TIM1,ENABLE); //TIM1 must be setup MOE
  97.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1               
  98.         TIM_CtrlPWMOutputs(TIM1,ENABLE); //TIM1 must be setup MOE       
  99. }

  100. /***********************************************
  101. //TIM8_CH2(PC7) 单脉冲输出+重复计数功能初始化
  102. //TIM8 时钟频率 72MHz
  103. //arr:自动重装值
  104. //psc:时钟预分频数
  105. ************************************************/
  106. void TIM8_OPM_RCR_Init(u16 arr,u16 psc)
  107. {                                                          
  108.         GPIO_InitTypeDef GPIO_InitStructure;
  109.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  110.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  111.         NVIC_InitTypeDef NVIC_InitStructure;

  112.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //TIM8时钟使能
  113.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIOC外设时钟使能                                                                                    

  114.   //设置该引脚为复用输出功能,输出TIM8 CH2的PWM脉冲波形
  115.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM8_CH2
  116.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  117.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  118.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  119.        
  120.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  121.        
  122.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         
  123.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  
  124.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  125.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  126.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  127.         TIM_ClearITPendingBit(TIM8,TIM_IT_Update);

  128.         TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular); /********* 设置只有计数溢出作为更新中断 ********/
  129.         TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);/******* 单脉冲模式 **********/

  130.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  131.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出2使能
  132.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; /****** 比较输出2N失能 *******/
  133.         TIM_OCInitStructure.TIM_Pulse = arr>>1; //设置待装入捕获比较寄存器的脉冲值
  134.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  135.         TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  136.         TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2预装载使能         
  137.         TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
  138.        
  139.         TIM_ITConfig(TIM8, TIM_IT_Update ,ENABLE);  //TIM8   使能或者失能指定的TIM中断

  140.         NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;  //TIM8中断
  141.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级1级
  142.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级1级
  143.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  144.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  145.        
  146.         TIM_ClearITPendingBit(TIM8, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源
  147.         TIM_Cmd(TIM8, ENABLE);  //使能TIM8                                                                          
  148. }
  149. /******* TIM8更新中断服务程序 *********/
  150. void TIM8_UP_IRQHandler(void)
  151. {
  152.         if(TIM_GetITStatus(TIM8,TIM_FLAG_Update)!=RESET)//更新中断
  153.         {
  154.                 TIM_ClearITPendingBit(TIM8,TIM_FLAG_Update);//清除更新中断标志位               
  155.                 if(is_rcr_finish==0)//重复计数器未设置完成
  156.                 {
  157.                         if(rcr_integer!=0) //整数部分脉冲还未发送完成
  158.                         {
  159.                                 TIM8->RCR=RCR_VAL;//设置重复计数值
  160.                                 rcr_integer--;//减少RCR_VAL+1个脉冲                               
  161.                         }else if(rcr_remainder!=0)//余数部分脉冲 不位0
  162.                         {
  163.                                 TIM8->RCR=rcr_remainder-1;//设置余数部分
  164.                                 rcr_remainder=0;//清零
  165.                                 is_rcr_finish=1;//重复计数器设置完成                               
  166.                         }else goto out;   //rcr_remainder=0,直接退出                         
  167.                         TIM_GenerateEvent(TIM8,TIM_EventSource_Update);//产生一个更新事件 重新初始化计数器
  168.                         TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能       
  169.                         TIM_Cmd(TIM8, ENABLE);  //使能TIM8                       
  170.                         if(motor_dir==CW) //如果方向为顺时针   
  171.                                 current_pos+=(TIM8->RCR+1);//加上重复计数值
  172.                         else          //否则方向为逆时针
  173.                                 current_pos-=(TIM8->RCR+1);//减去重复计数值                       
  174.                 }else
  175.                 {
  176. out:                is_rcr_finish=1;//重复计数器设置完成
  177.                         TIM_CtrlPWMOutputs(TIM8,DISABLE);        //MOE 主输出关闭
  178.                         TIM_Cmd(TIM8, DISABLE);  //关闭TIM8                               
  179.                         printf("当前位置=%ld\r\n",current_pos);//打印输出
  180.                 }       
  181.         }
  182. }
  183. /******* TIM1更新中断服务程序 *********/
  184. void TIM1_UP_IRQHandler(void)
  185. {
  186.         if(TIM_GetITStatus(TIM1,TIM_FLAG_Update)!=RESET)//更新中断
  187.         {
  188.                 TIM_ClearITPendingBit(TIM1,TIM_FLAG_Update);//清除更新中断标志位               
  189.                 if(is_rcr_finish==0)//重复计数器未设置完成
  190.                 {
  191.                         if(rcr_integer!=0) //整数部分脉冲还未发送完成
  192.                         {
  193.                                 TIM1->RCR=RCR_VAL1;//设置重复计数值
  194.                                 rcr_integer--;//减少RCR_VAL+1个脉冲                               
  195.                         }else if(rcr_remainder!=0)//余数部分脉冲 不位0
  196.                         {
  197.                                 TIM1->RCR=rcr_remainder-1;//设置余数部分
  198.                                 rcr_remainder=0;//清零
  199.                                 is_rcr_finish=1;//重复计数器设置完成                               
  200.                         }else goto out;   //rcr_remainder=0,直接退出                         
  201.                         TIM_GenerateEvent(TIM1,TIM_EventSource_Update);//产生一个更新事件 重新初始化计数器
  202.                         TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能       
  203.                         TIM_Cmd(TIM1, ENABLE);  //使能TIM1                       
  204.                         if(motor_dir==CW) //如果方向为顺时针   
  205.                                 current_pos+=(TIM1->RCR+1);//加上重复计数值
  206.                         else          //否则方向为逆时针
  207.                                 current_pos-=(TIM1->RCR+1);//减去重复计数值                       
  208.                 }else
  209.                 {
  210. out:                is_rcr_finish=1;//重复计数器设置完成
  211.                         TIM_CtrlPWMOutputs(TIM1,DISABLE);        //MOE 主输出关闭
  212.                         TIM_Cmd(TIM1, DISABLE);  //关闭TIM8                               
  213.                         printf("当前位置=%ld\r\n",current_pos);//打印输出
  214.                 }       
  215.         }
  216. }
  217. /***************** 启动TIM8 *****************/
  218. void TIM8_Startup(u32 frequency)   //启动定时器8
  219. {
  220.         u16 temp_arr=1000000/frequency-1;
  221.         TIM_SetAutoreload(TIM8,temp_arr);//设定自动重装值       
  222.         TIM_SetCompare2(TIM8,temp_arr>>1); //匹配值2等于重装值一半,是以占空比为50%       
  223.         TIM_SetCounter(TIM8,0);//计数器清零
  224.         TIM_Cmd(TIM8, ENABLE);  //使能TIM8
  225. }
  226. /***************** 启动TIM1 *****************/
  227. void TIM1_Startup(u32 frequency)   //启动定时器2
  228. {
  229.         u16 temp_arr=1000000/frequency-1;
  230.         TIM_SetAutoreload(TIM1,temp_arr);//设定自动重装值       
  231.         TIM_SetCompare2(TIM1,temp_arr>>1); //匹配值2等于重装值一半,是以占空比为50%       
  232.         TIM_SetCounter(TIM1,0);//计数器清零
  233.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1
  234. }
  235. /********************************************
  236. //相对定位函数
  237. //motor motor is number
  238. //num 0~2147483647
  239. //frequency: 20Hz~100KHz
  240. //dir: CW(顺时针方向)  CCW(逆时针方向)
  241. *********************************************/
  242. void Locate_Rle(u8 motor,long num,u32 frequency,DIR_Type dir) //相对定位函数
  243. {
  244.         if(num<=0) //数值小等于0 则直接返回
  245.         {
  246.                 printf("\r\nThe num should be greater than zero!!\r\n");
  247.                 return;
  248.         }
  249.         if(motor==0)
  250.         {
  251.                 if(TIM1->CR1&0x01)//上一次脉冲还未发送完成  直接返回
  252.                 {
  253.                         printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
  254.                         return;
  255.                 }
  256.         }
  257.         else if(motor==1)
  258.         {
  259.                 if(TIM8->CR1&0x01)//上一次脉冲还未发送完成  直接返回
  260.                 {
  261.                         printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
  262.                         return;
  263.                 }
  264.         }
  265.         if((frequency<20)||(frequency>100000))//脉冲频率不在范围内 直接返回
  266.         {
  267.                 printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");
  268.                 return;
  269.         }
  270.        
  271.         motor_dir=dir;//得到方向       
  272.         if(motor==0)
  273.         {
  274.                 DRIVER_DIR1=motor_dir;
  275.         }
  276.         else if(motor==1)
  277.         {
  278.                 DRIVER_DIR=motor_dir;//设置方向
  279.         }
  280.        
  281.         if(motor_dir==CW)//顺时针
  282.                 target_pos=current_pos+num;//目标位置
  283.         else if(motor_dir==CCW)//逆时针
  284.                 target_pos=current_pos-num;//目标位置
  285.        
  286. //        rcr_integer=num/(RCR_VAL+1);//重复计数整数部分
  287. //        rcr_remainder=num%(RCR_VAL+1);//重复计数余数部分
  288. //        is_rcr_finish=0;//重复计数器未设置完成
  289.         if(motor==0)
  290.         {
  291.                 rcr_integer=num/(RCR_VAL1+1);//重复计数整数部分
  292.                 rcr_remainder=num%(RCR_VAL1+1);//重复计数余数部分
  293.                 is_rcr_finish=0;//重复计数器未设置完成
  294.                 TIM1_Startup(frequency);
  295.         }
  296.         else if(motor==1)
  297.         {
  298.                 rcr_integer=num/(RCR_VAL+1);//重复计数整数部分
  299.                 rcr_remainder=num%(RCR_VAL+1);//重复计数余数部分
  300.                 is_rcr_finish=0;//重复计数器未设置完成
  301.                 TIM8_Startup(frequency);//开启TIM8
  302.         }
  303. }
  304. /********************************************
  305. //绝对定位函数
  306. //num   -2147483648~2147483647
  307. //frequency: 20Hz~100KHz
  308. *********************************************/
  309. void Locate_Abs(u8 motor,long num,u32 frequency)//绝对定位函数
  310. {
  311.         if(motor==0)
  312.         {
  313.                 if(TIM1->CR1&0x01)//上一次脉冲还未发送完成 直接返回
  314.                 {
  315.                         printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
  316.                         return;
  317.                 }
  318.         }
  319.         else if(motor==1)
  320.         {
  321.                 if(TIM8->CR1&0x01)//上一次脉冲还未发送完成 直接返回
  322.                 {
  323.                         printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
  324.                         return;
  325.                 }
  326.         }
  327.        
  328.         if((frequency<20)||(frequency>100000))//脉冲频率不在范围内 直接返回
  329.         {
  330.                 printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");
  331.                 return;
  332.         }
  333.         target_pos=num;//设置目标位置
  334.         if(target_pos!=current_pos)//目标和当前位置不同
  335.         {
  336.                 if(target_pos>current_pos)
  337.                         motor_dir=CW;//顺时针
  338.                 else
  339.                         motor_dir=CCW;//逆时针
  340.                
  341.                 if(motor==0)
  342.                 {
  343.                         DRIVER_DIR1=motor_dir;
  344.                 }
  345.                 else if(motor==1)
  346.                 {
  347.                         DRIVER_DIR=motor_dir;//设置方向
  348.                 }
  349.                
  350.                 if(motor==0)
  351.                 {
  352.                         rcr_integer=abs(target_pos-current_pos)/(RCR_VAL1+1);//重复计数整数部分
  353.                         rcr_remainder=abs(target_pos-current_pos)%(RCR_VAL1+1);//重复计数余数部分
  354.                         is_rcr_finish=0;//重复计数器未设置完成
  355.                         TIM1_Startup(frequency);
  356.                 }
  357.                 else if(motor==1)
  358.                 {
  359.                         rcr_integer=abs(target_pos-current_pos)/(RCR_VAL+1);//重复计数整数部分
  360.                         rcr_remainder=abs(target_pos-current_pos)%(RCR_VAL+1);//重复计数余数部分
  361.                         is_rcr_finish=0;//重复计数器未设置完成
  362.                         TIM8_Startup(frequency);//开启TIM8
  363.                 }
  364.         }
  365. }




复制代码

  1. #ifndef __DRIVER_H
  2. #define __DRIVER_H
  3. #include "sys.h"
  4. #include "stdlib.h"       

  5. //////////////////////////////////////////////////////////////////////////////////         
  6. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  7. //此例程有参考论坛网友例程的一部分(http://www.openedv.com/thread-41832-1-1.html)
  8. //ALIENTEK战舰STM32开发板
  9. //步进电机驱动器 测试代码                          
  10. //lycreturn@ALIENTEK
  11. //技术论坛:www.openedv.com
  12. //修改日期:2016/05/12
  13. //版本:V1.0
  14. //版权所有,盗版必究。
  15. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  16. //All rights reserved       
  17. //********************************************************************************
  18. //修改日期:2016/05/12
  19. //////////////////////////////////////////////////////////////////////////////////
  20. /********** 驱动器 端口定义 **************
  21. //DRIVER_DIR   PC0
  22. //DRIVER_OE    PC2
  23. //STEP_PULSE   PC7 (TIM8_CH2,LCD_RW)
  24. ******************************************/
  25. #define DRIVER_DIR   PCout(8) // 旋转方向
  26. #define DRIVER_DIR1         PAout(4)
  27. #define DRIVER_OE    PCout(9) // 使能脚 低电平有效
  28. #define DRIVER_OE1         PAout(5)
  29. #define RCR_VAL    255  //每计数(RCR_VAL+1)次,中断一次,这个值(0~255)设置大一些可以降低中断频率
  30. #define RCR_VAL1    166  //每计数(RCR_VAL+1)次,中断一次,这个值(0~255)设置大一些可以降低中断频率
  31. typedef enum
  32. {
  33.         CW = 1,//高电平顺时针
  34.         CCW = 0,//低电平逆时针
  35. }DIR_Type;//运行方向

  36. extern long target_pos;//有符号方向
  37. extern long current_pos;//有符号方向

  38. void Driver_Init(void);//驱动器初始化
  39. void TIM8_OPM_RCR_Init(u16 arr,u16 psc);//TIM8_CH2 单脉冲输出+重复计数功能初始化
  40. void TIM1_OPM_RCR_Init(u16 arr,u16 psc);
  41. void TIM8_Startup(u32 frequency);   //启动定时器8
  42. void TIM1_Startup(u32 frequency);
  43. void Locate_Rle(u8 motor,long num,u32 frequency,DIR_Type dir); //相对定位函数
  44. void Locate_Abs(u8 motor,long num,u32 frequency);//绝对定位函数

  45. #endif

复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-5-12 19:54:05 | 显示全部楼层
我曾经出现过类似问题,后来发现一个解决方法(原理我也没理解),先初始tim8在初始tim1,之后就诡异的可以了

出0入0汤圆

发表于 2017-7-6 18:11:16 | 显示全部楼层
xianghaisha 发表于 2017-5-12 19:54
我曾经出现过类似问题,后来发现一个解决方法(原理我也没理解),先初始tim8在初始tim1,之后就诡异的可以 ...

我现在也遇到类似的诡异的问题, 我用TIM8的1和2通道输出pwm, 上电复位就没有pwm输出, 手动复位后就有pwm输出。现在都不知道怎么解决这个问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 10:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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