1 红外信号发射端最初是一种红外信号发射的特性,它通常是长图片中实现的类似功能,它们的类似直径是3mm的,另外下面还有5mm的。和led 3.3.3v,也是最简单的。的设备将最接近的驱动器,将最接近的驱动器连接到一起 。接收端与接收端的关系图是相反的。蓝色上图的一个方框不是一个简单的中出的内容。如0.56ms的高338kHz的。 pwm。实际测量的波形图,这个颜色8888的波端部分:详情可以方波的频率: 3000Hz。这里下个汇总:显示端与接收端的:
发射端输出38kHz的波,接收端低,否则接收端为高
3 红外发射端功能实现实例
下面进入到编程实践了。
的介绍 我们知道,要实现前面的亮度,我们首先要实现两个基本功能:
1 38kHz的方波输出
2 控制 38kHz 的方波在需要的时间打开和关闭
首先是波波输出,我们的波波来了,这里需要具体使用就生成38行的pwm函数。我这里是使用STM321111F4P6的芯片。
先用代码生成工具神器立方体生成代码:
初始化代码:
静态无效 MX_TIM21_Init(无效)
{
/* 用户代码开始 TIM21_Init 0 */
/* 用户代码结束 TIM21_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* 用户代码开始 TIM21_Init 1 */
/* 用户代码结束 TIM21_Init 1 */
htim21.Instance = TIM21;
htim21.Init.Prescaler = 15;
htim21.Init.CounterMode = TIM_COUNTERMODE_UP;
htim21.Init.Period = 25;
htim21.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim21.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
如果 (HAL_TIM_Base_Init(&htim21) != HAL_OK)
{
错误处理程序();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim21, &sClockSourceConfig) != HAL_OK)
{
错误处理程序();
}
如果 (HAL_TIM_PWM_Init(&htim21) != HAL_OK)
{
错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim21, &sMasterConfig) != HAL_OK)
{
错误处理程序();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 11;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim21, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
错误处理程序();
}
/* 用户代码开始 TIM21_Init 2 */
/* 用户代码结束 TIM21_Init 2 */
HAL_TIM_MspPostInit(&htim21);
}
启动关闭pwm代码:
//启动pwm
HAL_TIM_PWM_Start(&htim21,TIM_CHANNEL_1);
//停止pwm
HAL_TIM_PWM_Stop(&htim21,TIM_CHANNEL_1);
然后是根据这个功能,通过修改运行时间打开或运行,然后打开关闭或关闭波的时间长度
初始化:
静态无效 MX_TIM2_Init(无效)
{
/* 用户代码开始 TIM2_Init 0 */
/* 用户代码结束 TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* 用户代码开始 TIM2_Init 1 */
/* 用户代码结束 TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 159;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
如果 (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
错误处理程序();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
错误处理程序();
}
/* 用户代码开始 TIM2_Init 2 */
/* 用户代码结束 TIM2_Init 2 */
}
异常处理代码:
无效 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//风扇遥控器
如果 (htim == (&htim2)){
开关(remote_ctl.state){
案例 PRECODE_H:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
HAL_TIM_PWM_Stop(&htim21,TIM_CHANNEL_1);
TIM2->ARR = 900 - 1;//9ms
remote_ctl.state = PRECODE_L;
休息;
案例 PRECODE_L:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_TIM_PWM_Start(&htim21,TIM_CHANNEL_1);
TIM2->ARR = 450 - 1;//4.5ms
remote_ctl.state = USERCODE_H;
休息;
案例 USERCODE_H:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
HAL_TIM_PWM_Stop(&htim21,TIM_CHANNEL_1);
TIM2->ARR = 56 - 1;//0.56ms
remote_ctl.state = USERCODE_L;
休息;
案例 USERCODE_L:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_TIM_PWM_Start(&htim21,TIM_CHANNEL_1);
if(remote_ctl.usercode >> remote_ctl.usercnt & 0x01)
TIM2->ARR = 169 - 1;//1.69ms
别的
TIM2->ARR = 56 - 1;//0.565ms
remote_ctl.usercnt++;
如果(remote_ctl.usercnt >= 16){
远程ctl.usercnt = 0;
remote_ctl.state = CTLCODE_H;
} 别的 {
remote_ctl.state = USERCODE_H;
}
休息;
案例 CTLCODE_H:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
HAL_TIM_PWM_Stop(&htim21,TIM_CHANNEL_1);
TIM2->ARR = 56 - 1;//0.56ms
remote_ctl.state = CTLCODE_L;
休息;
案例 CTLCODE_L:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_TIM_PWM_Start(&htim21,TIM_CHANNEL_1);
if(remote_ctl.ctlcode >> remote_ctl.ctlcodecnt & 0x01)
TIM2->ARR = 169 - 1;//1.69ms
别的
TIM2->ARR = 56 - 1;//0.565ms
remote_ctl.ctlcodecnt++;
如果(remote_ctl.ctlcodecnt >= 17){
远程ctl.ctlcodecnt = 0;
remote_ctl.state = CTLSTOP;
} 别的 {
remote_ctl.state = CTLCODE_H;
}
休息;
案例 CTLSTOP:
HAL_TIM_PWM_Stop(&htim21,TIM_CHANNEL_1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
remote_ctl.state = PRECODE_H;
HAL_TIM_Base_Stop_IT(&htim2);
休息;
默认:
休息;
}
}
}
这里还有一些编码数据的细节不会贴出来,如果需要更多的源代码欢迎各位留言,我会尽快为你们提供详细信息。