我使用的是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).
万分感激.
---------------------------------
---------------------------------
真心求指导啊~~~~~~~~~~~
---------------------------------
你的载波好奇怪啊.
你直接输出PWM试试吧.
无载波,是没法控制的.
测的时候表笔不小心打到x10了,所以把峰峰值电压和平均值电压除以10就是正常的电压.
一周热门 更多>