k60单片机,依据红外信号识别方向控制舵机电机舵机的程序
红外信号采用海尔牌遥控器内置NEC协议, 协议包括9ms的高电平、4.5ms 的低电平、四个字节地址码和命令码,四个字节地址码分别为:地址码 0xC3,地址反码 0x3C,命令码 0x55,命令码反码 0xAA,低位首发。基带信号如下图1 所示
图1 基带信号图
实际信号中高电平为 38KHz的信号,实际信号如下图所示:
超声波导引信号频率为 40KHz的方波。
引脚使用:
KLED1 PTE0
KLED2 PTE1
SERVO
PWM PTA11
舵机占空比 18.5% 14.0% 11.3%
舵浆位置 左满舵 中间位置 右满舵
电机 PA07
红外接收器
1->PTB0
2->PTB4
3->PTB6
4->PTB8
5->PTB10
6->PTB16
7->PTB20
8->PTB22
k60单片机源程序如下:
- #include "common.h"
- #include "isr.h"
- #include "LedBuz.h"
- #include "FreeCars.h"
- #include "infrared.h"
- #include "motor.h"
- #include "servo.h"
- #include "oled.h"
- #include "VoltageDetect.h"
- #include "wdog.h"
- #include "dirCtrl.h"
- /* 修改主频 请使用 CMSIS标准文件 system_MKxxxx.c 中的 CLOCK_SETUP 宏 */
- void SysInitialization(void); //系统初始化
- //uint8_t startLineMaskFlag = 0; //起跑线屏蔽标志
- //uint32_t VoltageTime,MenuTime,FreeCarsTime,ImgDealFreTimer,StartRunTime,StartLineDetectTime;
- int main(void)
- {
- test_motor=1500;
- SysInitialization(); //系统初始化
-
- EnableInterrupts(); //开启全部中断
-
- KLED2_ON;
- KLED1_ON;
- //test_motor=1580;
- Servo_Test=1455;
- DelayMs(1000);
- while(1)
- {
-
- //SingleMotor_Control(test_motor);
- //Servos_control(Servo_Test);
-
- //DirPIDCalculate();
- // VoltageConvert();
- //KLED1_REV;
- KLED2_REV;
- SingleMotor_Control(test_motor);
- DirPIDCalculate();
-
- }
- }
- //系统初始化
- void SysInitialization(void)
- {
- DisableInterrupts(); //禁止全部中断
- DelayInit(); //延时函数初始化,使用的是DWT
- GPIO_LedBuzInit(); //初始化LED和蜂鸣器引脚
- FreeCars_Init(); //FreeCars上位机UART引脚配置
- Motor_Init(); //电机初始化(包含单电机和双电机的,在Preprocessor Symbols中设置)
- Servo_Init(); //舵机初始化 50Hz
- //Voltage_Init(); //电压检测初始化
- DirPID_Init(); //方向PID参数初始化
- GPIO_InfraredInit(); //红外接收器初始化
- PIT_QuickInit(HW_PIT_CH0, 10000); //CH0 10ms中断,用于舵机PID控制
- ISR_Config(); //所有中断的配置,该函数应放在所有初始化函数之后
- }
复制代码
所有资料51hei提供下载:
红外程序.rar
(5.94 MB, 下载次数: 23)
|