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

2019-08-16 19:24发布

我使用的是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).
万分感激.










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。