历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2019年04月23日 | stm32红外遥控的定时器实现

2019-04-23 来源:eefocus

我用的红外遥控是使用的NEC协议,即使用PWM来调制发送的信息    NEC协议,其特征如下:


 1、8位地址和8位指令长度;


 2、地址和命令2次传输(确保可靠性)


 3、PWM脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;


 4、载波频率为38Khz;


 5、位时间为1.125ms或2.25ms;


NEC码的位定义:一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。


NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。


 stm32红外遥控的定时器实现

红外接收头与stm32连接如上图所示,既然是PWM调制,很容易想到了stm32的通用定时器的输入捕获和输出比较功能,这里由于stm32是接收红外遥控发送的信息,所以与红外接收头连接的IO口要设置位输入模式,因为在空闲状态的时候输入始终要保持高电平,所以要配置成上拉输入。


 


              


RCC->APB2ENR|=1<<3;


       GPIOB->CRH&=0xffffff0f; 


       GPIOB->CRH|=0x00000080; 


       GPIOB->ODR|=1<<9;


 


因为PB.9是通用定时器的通道四,所以还要对定时器进行配置,额。。。好长时间没有用定时器了,都忘得差不多了,又得重新拾起来             


 void time4_init()


{


 RCC->APB1ENR|=1<<2;//开启定时器四的时钟


 TIM4->SR=0;//其实复位值就是0,多此一举了


 TIM4->DIER|=1<<4;//允许定时器四的捕获中断


 TIM4->PSC=71;//计数频率设置为1M CNT每增加一 时间为1us


 TIM4->ARR=10000;//计数器每隔10ms溢出一次


 TIM4->CCMR2|=1<<8;//CC4通道被配置为输入,IC4映射在TI4上;


 TIM4->CCER&=~(1<<13);//通道四配置为上升沿捕获


 TIM4->CCMR2|=3<<12;//进行滤波处理


 TIM4->CCER|=1<<12;//通道四捕获使能


  TIM4->CR1|=1<<0;//定时器四计数使能


}


 


因为红外接收头接收的信号第一个数据必然是同步码,首先低电平保持9ms,然后一个跳变,高电平保持4.5ms,而我们判断接收的数据是逻辑0还是逻辑1,或者是同步码,都是要根据高电平的持续时间来判定的,所以要关心高电平保持时间,故定时器四初始化时要配置为上升沿捕获,好了,定时器也设置好了,接下来该设置定时器四的中断处理函数啦


 


对啦,要先把NVIC中的TIM4中断打开


void nvic_init()


{


 NVIC->ISER[0]|=1<<30;//TIM4的中断编号为30


}


 


void TIM4_IRQHandler(void)


{


 if(TIM4->SR&0X10)


 {


  if(CS==1)//发生上升沿捕获


  {


   TIM4->CNT=0;


   TIM4->CCER|=1<<13;


   TIM4->SR=0;


   dcb=1;


  }


 


  if(CS==0)//发生下降沿捕获


  {


     TIM4->SR=0;


     if(dcb==1)  


    {


  dcb=0;


  temp=TIM4->CCR4;


  TIM4->CCER&=~(1<<13);//改为上升沿捕获


  if(temp>4200&&temp<4700)


  {


   led1=~led1;


   OK1=1;


  }


  if(OK1==1)


  { 


  if(temp>1400&&temp<1800)


  {


data=(data<<1);


data|=1<<0;


ray_flag++;


  }


  if(temp>300&&temp<800)


  {


data=(data<<1);


data&=~(1<<0);


ray_flag++;


  }


  


  }


   if(ray_flag==32)


 {


    OK2=1;


led0=~led0;


  }


 


 


}


 


   }


 }


 }


  


   


 if(ray_flag>=32)//NEC协议 一次发送的数据位为32位


    OK2=1;


     TIM4->SR=0;


  }


 


   }


 }


 }


 


中断服务程序配置好了,接下来就是中程序啦


 


int main()


{


 Stm32_Clock_Init(9);


 delay_init(72);


 gpio_init();


 nvic_init();


 time4_init();


 usart1_init();


 while(1)


 {


  if(OK1==1&&OK2==1)


  {


   usart1_senddata(temp);


   OK1=0;


   OK2=0;


   ray_flag=0;


  }


 }


 


使用的是串口打印数据,串口配置程序就不写啦

推荐阅读

史海拾趣

Continental Industries公司的发展小趣事

面对电子行业日益激烈的竞争和不断变化的市场需求,Continental Industries积极应对挑战。公司加强了对市场趋势的研究和分析,不断调整产品结构和市场策略。同时,公司还加大了对新技术和新材料的研发力度,努力提升产品的竞争力和附加值。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

面对市场的多元化需求,HVPSI不断扩展其产品线,从最初的高压电源模块拓展到高压直流电源、高压脉冲电源等多个领域。公司还投入大量资源研发新型材料和技术,以提升产品的性能和可靠性。这些努力使得HVPSI能够提供全方位的高压电源解决方案,满足不同行业、不同应用场景的需求。

EUCHNER公司的发展小趣事

EUCHNER公司一直将产品创新视为其核心竞争力。公司不断投入研发资源,推出了一系列具有创新性的产品,如安全限位开关CES-CMFS系列、机械式安全开关MGB系列以及多光束安全栅ESPE系列等。这些产品在汽车制造、轨道交通、环保监测等领域得到了广泛应用,并赢得了客户的广泛赞誉。通过产品创新和市场拓展,EUCHNER公司的市场份额逐年提升。

AEM [ American Electronic Materials]公司的发展小趣事

AEM公司起源于美国,其创立之初便致力于电子元器件的研发与生产。在早期,AEM便以其独特的创新理念和先进的技术水平,迅速在电子元器件市场中崭露头角。公司通过不断的技术研发,成功开发出了一系列具有竞争力的电子元器件产品,如高性能的电阻器、电容器等,这些产品广泛应用于通信设备、计算机、消费电子等多个领域。

随着技术的不断进步,AEM逐渐积累了丰富的经验和专业知识,其产品在市场上得到了广泛的认可。同时,AEM还积极拓展海外市场,将产品出口到全球多个国家和地区,进一步提升了公司的国际影响力。

天钰(FITIPOWER)公司的发展小趣事

在追求经济效益的同时,AEM始终关注环境保护和可持续发展。公司积极响应全球环保倡议,采用环保材料和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,AEM还投入大量资源研发节能环保的电子元器件产品,为客户提供更加绿色、高效的解决方案。

此外,AEM还积极参与社会公益活动,关注社会责任。公司通过捐款、赞助等方式支持教育、文化等事业的发展,为社会的和谐与进步贡献了自己的力量。

问答坊 | AI 解惑

优秀博客赏析---总结lcd1602的程序代码编写

总结lcd1602的程序代码编写  https://home.eeworld.com.cn/?uid-78120-action-viewspace-itemid-8911 智能车制作全过程 https://home.eeworld.com.cn/?uid-89395-action-viewspace-itemid-8910 调试时钟芯片DS1302有感 https://home.ee ...…

查看全部问答>

S3c610 Codec移植的工作经验总结[bootloader级]

1. S3C6410与WM9713的I2S,AC97,PCM相比较: 1.I2S,AC97,PCM是不同的,各是各的,三者时序不同,要双方通信,必须要是 同一种时序,要么均是I2S,要么均是AC97,要么均是PCM 2.S3C6410的I2S,AC97,PCM复用同一组Pin脚,但同一时间只能用一种类型 ...…

查看全部问答>

单片机卡发板免费送

第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载 第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载 下载50个单片机程序实例和开发板原理图,学林电子免费开发板暑期助学活动报名!暑假在家 ...…

查看全部问答>

关于mini2440 mmu

前几天拿到一个mini2440,板子很精致。400M的主频,在跑uCos2的时候,发现速度很慢,可是却不知道为什么。怀疑是cache没有利用起来,可是我对于MMU也不是很明白,有没有点建议? void MMU_Init(void) {     int i,j;     / ...…

查看全部问答>

有用过AD2S80的朋友吗

本人在使用该芯片过程中遇到一些问题,想请有经验的朋友指教一下。 本人用720极的圆感应同步器作为角度传感器,想利用AD2S80来解码。 激磁信号使用的是5Khz的正弦波,AD2S80设置的分辨率为12位,该芯片的外围电路完全按照芯片手册上的针对5KHZ/12 ...…

查看全部问答>

NEC,有时候老是下载不进去程序,出现错误writing to the on-chip debug reserved area is prohibited

NEC,有时候老是下载不进去程序,出现错误writing to the on-chip debug reserved area is prohibited…

查看全部问答>

应急灯电池充电芯片S8233的资料

是三节LI电池的充电芯片,自己想改电池的可以看一下。…

查看全部问答>

有没有一款好的STM8/32的烧写仿真器,大家推荐一下

有没有一款好的STM8/32的烧写仿真器,大家推荐一下。 我先前有的是ST LINK ,用了快一年,用坏了4个ST LINK,有什么替代的东西吗? 再问一下,STM8还有什么烧写器?…

查看全部问答>

简单的程序看了半天不知错在哪!

本人初学avr,学到数码管。我学习板上数码管位选是由74ls138控制,段选是由74hc595控制。。下面是本人写的程序,,目的是让第二个数码管显示1,从中午一直看到现在不知道到底错在哪!大侠求助啊!!!     #include<iom16v.h>#incl ...…

查看全部问答>

菜鸟求助,定时器中断

interrupt void cpu_timer1_isr(void) {                        GpioDataRegs.GPADAT.all = 1…

查看全部问答>