完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
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); 休息; 默认: 休息; } } } 这里还有一些编码数据的细节不会贴出来,如果需要更多的源代码欢迎各位留言,我会尽快为你们提供详细信息。 |
|
|
|
只有小组成员才能发言,加入小组>>
3308 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9049 浏览 16 评论
4083 浏览 18 评论
1167浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 11:21 , Processed in 1.154266 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号