找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时器1,舵机和超声波冲突了,应该怎么设置呀?

[复制链接]
跳转到指定楼层
楼主
ID:462324 发表于 2022-1-18 13:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
舵机和超声波冲突了,应该怎么设置呀,定时器2.3用于编码器测速了

单片机源程序如下:
  1. #include "moto.h"
  2. #include "usart.h"       
  3. #include "delay.h"
  4. #include "pwm.h"               
  5. /*****************   *********************************************************
  6. 函数功能:舵机PWM以及定时中断初始化
  7. 入口参数:入口参数:arr:自动重装值  psc:时钟预分频数
  8. 返回  值:无
  9. **************************************************************************/

  10. uint16_t count;

  11. void TRIG_Init(void)
  12. {

  13. GPIO_InitTypeDef  GPIO_InitStructure;
  14.        
  15. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口时钟
  16.         /*TRIG 触发信号 PB14*/
  17.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//引脚14
  18.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //复用推挽输出模式,定时器功能为A0引脚复用功能
  19.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //定义该引脚输出速度为50MHZ
  20.   GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引脚GPIOA0
  21.          
  22.   GPIO_SetBits(GPIOB,GPIO_Pin_12);                                                 

  23. }

  24. void Motor_PWM_Init(u16 arr,u16 psc)        
  25. {
  26.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  27.         TIM_OCInitTypeDef TIM_OCInitStruct;
  28.   GPIO_InitTypeDef GPIO_InitStruct;                             
  29.        
  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);   //使能定时器4时钟
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIOB的时钟
  32.        
  33.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出
  34.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;   //PB6 7 8 9
  35.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  36.   GPIO_Init(GPIOB,&GPIO_InitStruct);
  37.        
  38.         TIM_TimeBaseInitStruct.TIM_Period = arr;              //设定计数器自动重装值
  39.         TIM_TimeBaseInitStruct.TIM_Prescaler  = psc;          //设定预分频器
  40.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
  41.         TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;         //设置时钟分割
  42.         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);       //初始化定时器
  43.        
  44.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //选择PWM1模式
  45.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  46.         TIM_OCInitStruct.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
  47.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //设置输出极性
  48.         TIM_OC1Init(TIM4,&TIM_OCInitStruct);                       //初始化输出比较参数
  49.        
  50.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //选择PWM1模式
  51.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  52.         TIM_OCInitStruct.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
  53.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //设置输出极性
  54.         TIM_OC2Init(TIM4,&TIM_OCInitStruct);                       //初始化输出比较参数
  55.        
  56.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //选择PWM1模式
  57.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  58.         TIM_OCInitStruct.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
  59.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //设置输出极性
  60.         TIM_OC3Init(TIM4,&TIM_OCInitStruct);                       //初始化输出比较参数
  61.        
  62.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //选择PWM1模式
  63.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  64.         TIM_OCInitStruct.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
  65.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //设置输出极性
  66.         TIM_OC4Init(TIM4,&TIM_OCInitStruct);                       //初始化输出比较参数
  67.        
  68.         TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH1使能预装载寄存器
  69.         TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH2使能预装载寄存器
  70.         TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH3使能预装载寄存器
  71.         TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH4使能预装载寄存器
  72.        
  73.         TIM_ARRPreloadConfig(TIM4, ENABLE);                //使能TIM4在ARR上的预装载寄存器
  74.        
  75.         TIM_Cmd(TIM4,ENABLE);                              //使能定时器4
  76. }


  77. /*****************   *********************************************************
  78. 函数功能:舵机PWM以及定时中断初始化
  79. 入口参数:入口参数:arr:自动重装值  psc:时钟预分频数
  80. 返回  值:无
  81. **************************************************************************/
  82. void Servo_PWM_Init(u16 arr,u16 psc)
  83. {                        
  84.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  85.         NVIC_InitTypeDef NVIC_InitStruct;
  86.         TIM_OCInitTypeDef TIM_OCInitStruct;
  87.   GPIO_InitTypeDef GPIO_InitStruct;  
  88. //        TIM_ICInitTypeDef  TIM3_ICInitStructure; //定义一个定时器捕获输入初始化的结构体       
  89. //       
  90.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   //使能定时器1时钟
  91.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIOA的时钟
  92.        
  93.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出
  94.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;                //PA11
  95.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  96.   GPIO_Init(GPIOA,&GPIO_InitStruct);
  97.        
  98.         /*ECOH 回响信号 PB7*/
  99.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;//引脚13
  100.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //设置为浮空输入
  101.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //定义该引脚输出速度为50MHZ
  102.   GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化引脚GPIOA0
  103.          
  104.        
  105.         TIM_TimeBaseInitStruct.TIM_Period = arr;              //设定计数器自动重装值
  106.         TIM_TimeBaseInitStruct.TIM_Prescaler  = psc;          //设定预分频器
  107.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
  108.         TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;         //设置时钟分割
  109.         TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
  110.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);       //初始化定时器
  111.        
  112.         TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);               //使能定时器中断
  113.                
  114.        
  115.         NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn;        //使能外部中断通道
  116.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;           //使能外部中断通道
  117.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1
  118.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        //响应优先级1
  119.         NVIC_Init(&NVIC_InitStruct);
  120.        
  121.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //选择PWM1模式
  122.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  123.         TIM_OCInitStruct.TIM_Pulse = 0;                            //设置待装入捕获比较寄存器的脉冲值
  124.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //设置输出极性
  125.         TIM_OC4Init(TIM1,&TIM_OCInitStruct);                       //初始化输出比较参数
  126.        
  127.         TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能预装载寄存器
  128.                 TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能预装载寄存器
  129.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能预装载寄存器
  130.                 TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能预装载寄存器
  131.                
  132.         TIM_CtrlPWMOutputs(TIM1,ENABLE);  //高级定时器输出需要设置这句
  133.        
  134.         TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIM1在ARR上的预装载寄存器
  135.         TIM_ClearFlag(TIM1, TIM_FLAG_Update);  // Clears the TIMx's pending flags.
  136. //        TIM1->CCR4=1400;
  137. //       
  138. //        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许TIM1更新中断|允许TIM1通道1捕获中断       
  139.         TIM_Cmd(TIM1,ENABLE);                              //使能定时器1
  140. }



  141. void Count_Dist(void)
  142.         {
  143.         int distance = 0, sum = 0;
  144.         uint16_t time;
  145.         uint16_t i = 0;
  146.         delay_init();  //在 delay.h 中
  147.                     TRIG_Init();
  148.         while(i < 5){
  149.                 GPIO_SetBits(GPIOB, GPIO_Pin_12);
  150.                 delay_us(20);
  151.                 GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  152.                                        TIM_Cmd(TIM1,DISABLE);  //关闭定时器
  153.                TIM1->CCR1=0;  //TIM3的计数器清零
  154.                 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);
  155.                  TIM_Cmd(TIM1, ENABLE);  //打开定时器
  156.                 i += 1;
  157.                 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1);  //回响信号消失
  158.                 TIM_Cmd(TIM1,DISABLE);  //关闭定时器


  159.                 time = TIM_GetCounter(TIM1);  //获取 TIM2 计数值;  //获取 TIM2 计数值

  160.                 distance = (time + count*1000)/58.0;  //通过回响信号计算距离
  161.                 sum = distance + sum;  //将五次结果相加

  162.                 TIM1->CCR1 = 0;  //将TIM2计数寄存器的计数值清零
  163.                 count = 0;  //中断溢出次数清零
  164.                 delay_ms(10);
  165.         }      
  166.         distance = (sum/5);  //取5次的平均值
  167.                                         printf("%d  \n",distance);       
  168.       
  169. }

  170. void TIM1_UP_IRQHandler(void) {  //中断函数
  171.         if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) {
  172.                 TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除中断标志

  173.                 count++;
  174.         }
  175. }
复制代码


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

使用道具 举报

沙发
ID:161164 发表于 2022-1-18 17:48 | 只看该作者
舵机需要输出稳定而连续的脉冲来维持角度
所以舵机的定时器不能停
但编码器测速不用连续去量
可以借一下定时器来用
回复

使用道具 举报

板凳
ID:462324 发表于 2022-1-18 18:34 | 只看该作者
lkc8210 发表于 2022-1-18 17:48
舵机需要输出稳定而连续的脉冲来维持角度
所以舵机的定时器不能停
但编码器测速不用连续去量

好的,那我就测一个轮子的速度就可以,谢谢呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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