OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8926|回复: 15

STM32 红外遥控,控制格力空调疑问

[复制链接]

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
发表于 2014-2-9 15:22:11 | 显示全部楼层 |阅读模式
我使用的是STM32F373CC这个芯片来做红外遥控.选用的是TIM2_CH3(PA2)作为Ir_Out.
第一步,测出格力空调遥控器(型号为:YAD0F1)控制波形如右图(这个是部分的波形),所有的数据解码来如下: 
 引导码(9ms+4.5ms) 001111001010000000000100000010100100 间隔20ms 000000000000010000000000000010110 间隔40ms 引导码(9ms+4.5ms) 001111001010000000000100000011100100间隔20ms 000000000000000000001100000001110
以上是按一次遥控开命令所读到的所有数据.
第二步,使用STM32F373的TIM2_CH3发出38K HZ的载波,然后通过systick定时器来开关PWM的输出.输出波形如下:
发送的数据跟遥控解码的数据一模一样.
代码如下:
TIM2定时器配置
void TIM2_Config(void)
{
// u32 counter=0;
uint16_t CCR2_Val = 433;//433
uint16_t PrescalerValue = 0;
  GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* GPIOA clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  
  /* GPIOA Configuration: TIM2 CH3 (PA2) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;
  GPIO_Init(GPIOA, &GPIO_InitStructure); 

  /* Connect TIM2 pins to AF1 */  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); 
// PrescalerValue = (uint16_t) ((SystemCoreClock) / 38000000) - 1;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 1314;//1314
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;   
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

  TIM_ARRPreloadConfig(TIM2, ENABLE);

  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE);
// TIM_SetCompare1(TIM2,625); 
}

IO口(PA2)模式切换
void ModeChange(u32 mode)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
if(mode==PWM)
{
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); 
}
else
{
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
}
代码发送函数
void Send_Code(TIM_TypeDef * TIMx)
{
 BootCode(TIMx);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,4);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,1);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,10);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,6);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,1);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,2);
delay_ms(20);
Logic_ZeroN(TIMx,13);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,14);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,1);
Logic_OneN(TIMx,2);
Logic_ZeroN(TIMx,1);
delay_ms(40);
BootCode(TIMx);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,4);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,1);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,10);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,6);
Logic_OneN(TIMx,3);
Logic_ZeroN(TIMx,2);
Logic_OneN(TIMx,1);
Logic_ZeroN(TIMx,2);
delay_ms(20);
Logic_ZeroN(TIMx,20);
Logic_OneN(TIMx,2);
Logic_ZeroN(TIMx,7);
Logic_OneN(TIMx,3);
Logic_ZeroN(TIMx,1);
}

引导码及逻辑0和逻辑1函数
void BootCode(TIM_TypeDef * TIMx)
{
TIM_Cmd(TIMx, ENABLE);
//    ModeChange(PWM);
delay_ms(9);
TIM_Cmd(TIMx, DISABLE);
//    ModeChange(Low);
delay_us(4500);
}


void Logic_One(TIM_TypeDef * TIMx)
{
 ModeChange(PWM);
TIM_Cmd(TIMx, ENABLE);
delay_us(565);//656
TIM_Cmd(TIMx, DISABLE);
    ModeChange(Low);
delay_us(1695);//1640
}

void Logic_Zero(TIM_TypeDef * TIMx)
{
  ModeChange(PWM);
TIM_Cmd(TIMx, ENABLE);
delay_us(565);//656
TIM_Cmd(TIMx, DISABLE);
    ModeChange(Low);
delay_us(565);//544
}

void Logic_ZeroN(TIM_TypeDef * TIMx,u32 num)
{
u32 i=0;
for(;i<num;i++)
{
Logic_Zero(TIMx);
}
}

void Logic_OneN(TIM_TypeDef * TIMx,u32 num)
{
u32 i=0;
for(;i<num;i++)
{
Logic_One(TIMx);
}
}

最后疑问:
1.用试波器测出来的遥控波形为什么跟网上的波形不一致(我用STM32做的波形基本跟网上的差不多)
2.我的波形发出来后,无法控制空调(完全没反应).
请问以上是为什么?是我程序的问题,还是波形调制有问题?
请大侠帮忙指导了,弄了3周了,这个遥控器还没有出来.跪求指导,可加QQ79444528(layman).
万分感激.










正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165452
金钱
165452
注册时间
2010-12-1
在线时间
2113 小时
发表于 2014-2-9 15:31:33 | 显示全部楼层
第1,2个图,是怎么测试的?这么奇怪?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-2-9 15:32:22 | 显示全部楼层
是在遥控发射头的两端测试的,.回复【2楼】正点原子:
---------------------------------
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-2-9 15:43:20 | 显示全部楼层
原子哥,我刚刚把发射的LED拆下来测量遥控两端的波形如下:
疑问1:为什么没有载波了?但是接上LED就会有(如1,2图),这是为什么?
疑问2:如果不要载波,我直接控制IO的高低电平就可以控制吗?


回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-2-9 15:43:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
真心求指导啊~~~~~~~~~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165452
金钱
165452
注册时间
2010-12-1
在线时间
2113 小时
发表于 2014-2-9 17:19:29 | 显示全部楼层
回复【4楼】wenwubie:
---------------------------------
你的载波好奇怪啊.
你直接输出PWM试试吧.

无载波,是没法控制的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-2-10 10:27:33 | 显示全部楼层
原子哥,这个是我用PA2直接输出的38K载波波形图,你看下是否有问题.
测的时候表笔不小心打到x10了,所以把峰峰值电压和平均值电压除以10就是正常的电压.





回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-2-10
在线时间
2 小时
发表于 2014-2-10 10:39:25 | 显示全部楼层
如果二极管发出的波形对的而不能控制,那就是发射功率不够了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165452
金钱
165452
注册时间
2010-12-1
在线时间
2113 小时
发表于 2014-2-10 12:38:06 | 显示全部楼层
回复【7楼】wenwubie:
---------------------------------
这个波形OK啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165452
金钱
165452
注册时间
2010-12-1
在线时间
2113 小时
发表于 2014-2-10 12:38:31 | 显示全部楼层
7楼的意见不错,楼主,你的驱动二极管的电路是怎么样的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-2-10 15:30:38 | 显示全部楼层
我是从IO口直接连接到发光二极管的,这样可以么? 我手头没有现成的驱动芯片.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165452
金钱
165452
注册时间
2010-12-1
在线时间
2113 小时
发表于 2014-2-10 15:54:24 | 显示全部楼层
回复【11楼】wenwubie:
---------------------------------
加个三极管扩流,IO直接输出,能力不够哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-9
在线时间
1 小时
 楼主| 发表于 2014-3-11 15:34:44 | 显示全部楼层
谢谢原子哥,加上三极管以后,已经可以正常发送,感谢!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2015-6-1
在线时间
10 小时
发表于 2015-6-12 17:52:58 | 显示全部楼层
原子哥,久仰大名,想请教一个问题,我是用PWM调制脉冲进行发送红外数据,但是红外发射接收头很烫,系统刚启动第一次可以准确发送(接收端可以收到正确),后面发送的都是跟准确的发送码比较类似,但是使用定时器的方法进行发送是可以的(而且不会发烫),这是为什么呢?
回复 支持 反对

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-12 20:51:36 | 显示全部楼层
发烫肯定是功耗过大。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-7-27
在线时间
3 小时
发表于 2017-7-27 17:21:44 来自手机 | 显示全部楼层
楼主,你在哪里买的红外发射口,求教
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 12:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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