找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1791|回复: 1
收起左侧

stm32编码器测量

[复制链接]
ID:366526 发表于 2018-7-6 21:04 | 显示全部楼层 |阅读模式
含有一路,两路脉冲的测量
通过lcd屏显示
  1. #include "timer.h"
  2. #include "led.h"
  3. #include "usart.h"
  4. #include "sys.h"
  5. #include "key.h"      

  6. //PWM输出初始化
  7. //arr:自动重装值
  8. //psc:时钟预分频数

  9. //定时器2通道1输入捕获配置



  10. void TIM2_Cap_Init(u16 arr,u16 psc)
  11. {         
  12.         TIM_ICInitTypeDef  TIM2_ICInitStructure;
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  15.          NVIC_InitTypeDef NVIC_InitStructure;

  16.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能TIM2时钟
  17.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
  18. //                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能GPIOA时钟
  19.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0 输入  
  21.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  22.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA0 下拉
  23.         
  24.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;  //PA0 清除之前设置  
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0 输入  
  26.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  27.         GPIO_ResetBits(GPIOA,GPIO_Pin_14);                                                 //PA0 下拉
  28.         
  29.         //初始化定时器2 TIM2         
  30.         TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  31.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
  32.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  33.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  34.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  35.   
  36.         //初始化TIM2输入捕获参数
  37.         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  38.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  39.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  40.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  41.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  42.           TIM_ICInit(TIM2, &TIM2_ICInitStructure);
  43.         
  44.         //中断分组初始化
  45.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
  46.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
  47.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
  48.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  49.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  50.         
  51.         TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        
  52.         
  53.   TIM_Cmd(TIM2,ENABLE );         //使能定时器2

  54. }



  55. void TIM3_Cap_Init(u16 arr,u16 psc)
  56. {         
  57.         TIM_ICInitTypeDef  TIM2_ICInitStructure;
  58.         GPIO_InitTypeDef GPIO_InitStructure;
  59.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  60.          NVIC_InitTypeDef NVIC_InitStructure;

  61.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能TIM2时钟
  62.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
  63. //                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能GPIOA时钟
  64.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;  //PA0 清除之前设置  
  65.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0 输入  
  66.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  67.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA0 下拉
  68.         
  69.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;  //PA0 清除之前设置  
  70.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0 输入  
  71.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  72.         GPIO_ResetBits(GPIOA,GPIO_Pin_13);                                                 //PA0 下拉
  73.         
  74.         //初始化定时器2 TIM2         
  75.         TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
  76.         TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
  77.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  78.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  79.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  80.   
  81.         //初始化TIM2输入捕获参数
  82.         TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  83.           TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  84.           TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  85.           TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  86.           TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  87.           TIM_ICInit(TIM3, &TIM2_ICInitStructure);
  88.         
  89.         //中断分组初始化
  90.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM2中断
  91.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
  92.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
  93.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  94.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  95.         
  96.         TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        
  97.         
  98.   TIM_Cmd(TIM3,ENABLE );         //使能定时器2

  99. }

  100. u8  TIM2CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
  101. u16        TIM2CH1_CAPTURE_VAL;        //输入捕获值
  102. unsigned long a=10000;

  103. //定时器5中断服务程序         
  104. void TIM2_IRQHandler(void)
  105. {
  106.         if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  107.                 {        
  108.                         if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  109.                         {                                 
  110.                                         TIM2CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  111.                                 if(IN==1)
  112.                                                 {
  113.                                                         a++;
  114.                                                         
  115.                                                 }
  116.                                         if(IN==0)
  117.                                                 {
  118.                                                 a--;
  119.                                                 
  120.                                         }
  121.                                                 TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  122.                         }else                                                                  //还未开始,第一次捕获上升沿
  123.                         {
  124.                                 TIM2CH1_CAPTURE_STA=0;                        //清空
  125.                                 TIM2CH1_CAPTURE_VAL=0;
  126.                                  TIM_SetCounter(TIM2,0);
  127.                                 TIM2CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  128.                                    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  129.                         }                    
  130.                 }                                                                                    
  131.          
  132.     TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
  133. }


  134. u8  TIM3CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
  135. u16        TIM3CH1_CAPTURE_VAL;        //输入捕获值
  136. unsigned long b=10000;
  137. void TIM3_IRQHandler(void)
  138. {
  139.         if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  140.                 {        
  141.                         if(TIM3CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  142.                         {                                 
  143.                                         TIM3CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
  144.                                 if(in==1)
  145.                                                 {
  146.                                                         b++;
  147.                                                         
  148.                                                 }
  149.                                         if(in==0)
  150.                                                 {
  151.                                                 b--;
  152.                                                 
  153.                                         }
  154.                                                 TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  155.                         }else                                                                  //还未开始,第一次捕获上升沿
  156.                         {
  157.                                 TIM3CH1_CAPTURE_STA=0;                        //清空
  158.                                 TIM3CH1_CAPTURE_VAL=0;
  159.                                  TIM_SetCounter(TIM3,0);
  160.                                 TIM3CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  161.                                    TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  162.                         }                    
  163.                 }                                                                                    
  164.          
  165.     TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
  166. }



  167. #include "led.h"
  168. #include "delay.h"
  169. #include "sys.h"
  170. #include "timer.h"
  171. #include "usart.h"
  172. #include "key.h"
  173. //ALIENTEK Mini STM32开发板范例代码9
  174. //输入捕获实验   
  175. //技术支持:www.openedv.com
  176. //广州市星翼电子科技有限公司


  177. extern u8  TIM2CH1_CAPTURE_STA;                //输入捕获状态                                                   
  178. extern u16        TIM2CH1_CAPTURE_VAL ;        //输入捕获值
  179. extern u8  TIM3CH1_CAPTURE_STA;                //输入捕获状态                                                   
  180. extern u16        TIM3CH1_CAPTURE_VAL ;        //输入捕获值
  181. extern unsigned long a,b;
  182. int main(void)
  183. {        
  184.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  185.         delay_init();                     //延时函数初始化        
  186.         uart_init(9600);                                 //9600         
  187.         LED_Init();                          //初始化与LED连接的硬件接口
  188.          LCD_Init();              //串口初始化为115200
  189.          TIM2_Cap_Init(0XFFFF,0);                //以1Mhz的频率计数
  190.          TIM3_Cap_Init(0XFFFF,0);
  191.          KEY_Init();
  192.         LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");        
  193.         LCD_ShowString(30,70,200,16,16,"LIU HONG ZHI");
  194.         LCD_ShowString(30,90,200,16,16,"BIAN MA QI CE SHI");                                               
  195.         LCD_ShowString(30,130,200,12,12,"2018/6/25");         
  196.            while(1)
  197.         {
  198.                                                 
  199.         if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  200.    {        
  201.                   LCD_ShowxNum(30,180,a,8,24,0);        
  202.                         TIM2CH1_CAPTURE_STA=0;                        //开启下一次捕获
  203.                  }
  204.          if(TIM3CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  205.    {        
  206.                   LCD_ShowxNum(30,230,b,8,24,0);        
  207.                         TIM3CH1_CAPTURE_STA=0;                        //开启下一次捕获
  208.                  }
  209.         }
  210. }
复制代码


回复

使用道具 举报

ID:477269 发表于 2019-3-2 23:17 | 显示全部楼层
感谢楼主的贡献
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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