打印
[STM8]

STM8S105S4TC6编码器模式一直不能计数

[复制链接]
1675|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhenykun|  楼主 | 2021-10-19 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
咋回事?

使用特权

评论回复
沙发
jlyuan| | 2021-10-19 23:10 | 只看该作者

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
zhenykun|  楼主 | 2021-10-19 23:13 | 只看该作者
最近做个项目要用到编码器计量长度,采用STM8S105S4TC6编码器模式写了一个程序,调了半天仿真也没有计数,哪位大师帮助看看?

使用特权

评论回复
地板
heweibig| | 2021-10-19 23:16 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
zhenykun|  楼主 | 2021-10-19 23:18 | 只看该作者

#include <iostm8s105s4.h>

unsigned int f_encoder;
//-----------------------------------------------------------
void  WDT_Init(void)
{
    IWDG_KR = 0xCC;       //启动看门狗
    IWDG_KR = 0x55;       //解除写保护
    IWDG_PR = 0x06;       //256分频,最高1.02秒
    IWDG_RLR = 15;       //60ms
    IWDG_KR = 0xAA;       //写保护
}
//----------------------------------------------------------------
void  WDT(void)
  {
    IWDG_KR = 0xAA;       //喂狗指令WDT();
  }
//----------------------------------------------------------------
void  gpio_init(void)
{
    PA_DDR = 0xFF;
    PA_CR1 = 0xff;
    PA_CR2 = 0x00;
    PA_ODR = 0xFF;
   
    PB_DDR = 0xFC;//C;
    PB_CR1 = 0xff;
    PB_CR2 = 0x00;
    PB_ODR = 0xfC;

    PC_DDR = 0xFF;
    PC_CR1 = 0xff;
    PC_CR2 = 0x00;
    PC_ODR = 0xFF;
   

    PD_DDR =0xFF;
    PD_CR1 =0xff;
    PD_CR2 = 0x00;
    PD_ODR = 0xff;

      
    PE_DDR = 0xFF;
    PE_CR1 = 0xff;
    PE_CR2 = 0x00;
    PE_ODR = 0xBF;
   
    PG_DDR = 0xFF;
    PG_CR1 = 0xff;
    PG_CR2 = 0x00;
    PG_ODR = 0xFF;
}


#define FLASH_EOP 0X04  //标志位
     #define FLASH_DUL 0X08  //标志位
  
void FLASH_Init(void)  //端口重映射初始化函数,在此将PB0映射为TIM1_CH1
{
    unsigned char *flash_OPT2;
    unsigned char *flash_NOPT2;
   
    flash_OPT2=(unsigned char*)0x4803;   //OPT2寄存器的ADDR
    flash_NOPT2=(unsigned char*)0x4804;  //NOPT2寄存器的ADDR,此寄存器的值是OPT2的取反值
    //-------------------------------------------------------------
    //第一步  初始化FLASH
    while( (FLASH_IAPSR & FLASH_DUL) == 0X00 )     
    {
        FLASH_DUKR = 0XAE;      
        FLASH_DUKR = 0X56;   
    } //一旦配置失败,此处将陷入死循环。实际使用请加入超时机制,在此省略
    //-------------------------------------------------------------         
    //第二步  对OPT进行编程,首先需要如下操作:开启opt编程
    FLASH_CR2 |= 0X80;     //OPT  = 1
    FLASH_NCR2 &= 0X7F;    //NOPT = 0  
    //-------------------------------------------------------------      
    //第三步  修改内存
   // 1.修改参数,启用复用功能
   // 2.OPT2 和 NOPT2要相反
    //修改OPT2
    *flash_OPT2 = 0X20;      // 0000 0001  AFR0=1,PC5复用为TIM2_CH1其它默认清0  
    while( (FLASH_IAPSR & FLASH_EOP) == 0 );  //等待操作完成  
    //修改NOPT2
    *flash_NOPT2 =0XDF;// ~*flash_OPT2;   
    while( (FLASH_IAPSR & FLASH_EOP) == 0 );  //等待操作完成
    //一旦配置失败,此处将陷入死循环。实际使用请加入超时机制,在此省略
    //-------------------------------------------------------------  
    //第四步  对OPT进行编程,最后需要如下操作:禁用opt编程
    FLASH_CR2 &= ~0X80;    //OPT  = 1
    FLASH_NCR2 |= 0X80;    //NOPT = 0
}
//=============================================================================
void  TIM1_Init(void)
{
     CLK_PCKENR1 |=0X80; //开启time1时钟
     TIM1_SMCR |= 0X03;//2;    //工作在编码器模式2
     TIM1_CCMR1 |= 0X1;   //IC1FP1映射到TI1)
     TIM1_CCMR2 |= 0X1; //IC2FP2映射到TI2 CC2 MAP TI2FP2   CH2
   //  TIM1_ARRH = 0XEA;   // 60000产生溢出 最大65535
   //  TIM1_ARRL = 0X60;
     TIM1_IER |=0X1;   //开中断 ,开中断前要有中断处理程序,中断里需要清除中断标志位
     TIM1_CNTRH = 0xea; //我要有个大的初始化值
     TIM1_CNTRL=0x56;                              
     TIM1_CR1 =0X01;    //启动计数
  }
//==============================================================================
void main(void)   
{        
   asm("sim");    //关总中断
   
    gpio_init();
    FLASH_Init();
  
   TIM1_Init();
   
   WDT_Init();
//-----------------------------     
   asm("rim");    //开总中断  
     
   
while(1)   
  {  
    WDT();  //喂狗   
//----------------------------------------------------------
   f_encoder=(TIM1_ARRH<<8)|TIM1_ARRL;   
  }
}
//====================================================================
#pragma vector = TM1UPDATE_VECT
__interrupt void TIM1_UPDATE_ISR( void )
{
    TIM1_SR1 = 0;      // clear overflow flag
   
   
    if(TIM1_CR1 & 0x10)
    {
      f_encoder--;       //逆时针转
    }
    else
    {
      f_encoder++;     //顺时针转
    }
}

使用特权

评论回复
6
zhenykun|  楼主 | 2021-10-19 23:20 | 只看该作者
采用IAR编译器硬件仿真,旋转编码器始终不能计数,只有初始值.

使用特权

评论回复
7
zhenykun|  楼主 | 2021-10-19 23:34 | 只看该作者
端口映射直接在程序里做的,难道不能直接仿真吗?

使用特权

评论回复
8
chenho| | 2021-10-19 23:35 | 只看该作者
我最近也打算研究这个了。用STM8S003来进行编码器计数。有问题可以交流

使用特权

评论回复
9
zhenykun|  楼主 | 2021-10-19 23:38 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
10
qcliu| | 2021-11-7 16:27 | 只看该作者
编码器模式的功能是什么

使用特权

评论回复
11
kxsi| | 2021-11-7 16:33 | 只看该作者
使能这个模式了吗

使用特权

评论回复
12
drer| | 2021-11-7 16:36 | 只看该作者
确认一下端口映射的问题

使用特权

评论回复
13
gwsan| | 2021-11-7 16:39 | 只看该作者
可以使用哪个定时器啊

使用特权

评论回复
14
aoyi| | 2021-11-7 16:54 | 只看该作者
这个模式 和pwm有什么区别啊

使用特权

评论回复
15
SantaBunny| | 2023-3-5 16:52 | 只看该作者
关于STM模块的使用,要注意各个模块的共性:开启时钟、配置参数、配置中断、中断代码的处理

使用特权

评论回复
16
Stahan| | 2023-3-5 19:30 | 只看该作者
是不是端口映射的问题啊?

使用特权

评论回复
17
Clyde011| | 2024-5-1 07:24 | 只看该作者

然后将其用作在PCB组装过程中放置在另一个板上的独立部件。

使用特权

评论回复
18
公羊子丹| | 2024-5-1 08:17 | 只看该作者

选择测试方法和测试参数是检测过程中的重要步骤

使用特权

评论回复
19
万图| | 2024-5-1 09:20 | 只看该作者

它产生的噪声是对地噪声

使用特权

评论回复
20
Uriah| | 2024-5-1 10:23 | 只看该作者

然后在专用站中检查每个半孔,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

868

主题

11535

帖子

3

粉丝