第4题:电机/舵机相关(问的同学挺多的,先增加这个内容)
1.常见的控制/调速/测速等
2.完整的硬件图片、效果图片
3.引脚连接图等电路图(如板卡和显示板的连接示意图)
4.驱动芯片的手册资料等信息
1.硬件 2.SG90舵机介绍 3.硬件连接 4.效果说明 5.代码 6.工程文件及舵机资料
1.硬件 开发板: MSP432P401R LaunchPad 矩阵按键:4X4键盘
舵机: SG90舵机云台
2.SG90舵机介绍
3.硬件连接
* MSP432P401R * ------------------ * /|\| | * | | | * --|RST | * | | * 舵机 | | 矩阵按键 * | P1.6 |<-- C4 * | P1.7 |<-- C3 * | P6.7 |<-- C2 * | P2.3 |<-- C1 * | P6.6 |<-- R1 * 橙线<-|P2.4 P5.1 |<-- R2 * 红线<-|5V P5.2 |<-- R3 * 棕线<-|GND P5.6 |<-- R4
4.效果说明
* 从超声波模块背面向正面看,为舵机的正前方,来判断舵机的左转、右转情况
* 功能描述:初始状态,舵机面向正前方,
* 舵机的控制信号为周期20ms的PWM波,
* 脉冲宽度从0.5ms~2.5ms,相对舵盘+90°~-90°呈线性变化。
* 以下为矩阵按键按下对应舵机变化:
* S1 S2 S3 S4
* 左转45° 左转22.5° 右转22.5° 右转45°
*
* S5 S6 S7 S8
* 左转67.5° 正对前方 正对前方 右转67.5°
*
* S9 S10 S11 S12
* 左转90° 一直左转 一直右转 右转90°
*
* S13 S14 S15 S16
* 左转112.5° 不动 不动 右转112.5°
*
* 按下独立按键S1,PWM占空比+0.625%,舵机左转+11.25°
正对前方
左转45°
左转90°
右转45°
右转90°
停止不动
5.代码
开发环境:CCS10.1.1
- #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
- #include <stdint.h>
- #include <stdbool.h>
- //![单通道Timer_A 配置]
- // Timer_A PWM 配置参数
- Timer_A_PWMConfig pwmConfig =
- {
- TIMER_A_CLOCKSOURCE_SMCLK,
- TIMER_A_CLOCKSOURCE_DIVIDER_1,
- 1280, //64kHz时钟源,1280大约20ms
- TIMER_A_CAPTURECOMPARE_REGISTER_1,
- TIMER_A_OUTPUTMODE_RESET_SET,
- 96 //大约1.5ms,舵机正对正前方
- };
- //![单通道Timer_A 配置]
- #define HighC1 {MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);} //第1列C1输出高电平
- #define LowC1 {MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN3);} //第1列C1输出低电平
- #define HighC2 {MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN7);} //第2列C2输出高电平
- #define LowC2 {MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P6, GPIO_PIN7);} //第2列C2输出低电平
- #define HighC3 {MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN7);} //第3列C3输出高电平
- #define LowC3 {MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN7);} //第3列C3输出低电平
- #define HighC4 {MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6);} //第4列C4输出高电平
- #define LowC4 {MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6);} //第4列C4输出低电平
- int main(void)
- {
- //配置列信号作为输出
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN3); //第1列C1
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P6, GPIO_PIN7); //第2列C2
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN7); //第3列C3
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN6); //第4列C4
- //所有列输出低电平
- LowC1;
- LowC2;
- LowC3;
- LowC4;
- //配置第1行R1--P6.6为上拉电阻输入并使能中断
- MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P6, GPIO_PIN6);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P6, GPIO_PIN6);
- MAP_GPIO_enableInterrupt(GPIO_PORT_P6, GPIO_PIN6);
- MAP_Interrupt_enableInterrupt(INT_PORT6);
- //配置第2行R2--P5.1为上拉电阻输入并使能中断
- MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5, GPIO_PIN1);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, GPIO_PIN1);
- MAP_GPIO_enableInterrupt(GPIO_PORT_P5, GPIO_PIN1);
- //配置第3行R3--P5.2为上拉电阻输入并使能中断
- MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5, GPIO_PIN2);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, GPIO_PIN2);
- MAP_GPIO_enableInterrupt(GPIO_PORT_P5, GPIO_PIN2);
- //配置第4行R4--P5.6为上拉电阻输入并使能中断
- MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5, GPIO_PIN6);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, GPIO_PIN6);
- MAP_GPIO_enableInterrupt(GPIO_PORT_P5, GPIO_PIN6);
- MAP_Interrupt_enableInterrupt(INT_PORT5);
- //关闭看门狗
- MAP_WDT_A_holdTimer();
- //![单通道Timer_A 配置]
- //配置 MCLK to REFO at 128Khz for LF mode
- //配置 SMCLK to 64Khz
- MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);
- MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
- MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2);
- MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);
- //配置 GPIO2.4 为PWM外围输出, P1.1 为按键中断
- MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,
- GPIO_PRIMARY_MODULE_FUNCTION);
- MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1);
- MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
- //配置Timer_A 周期大约 20ms ,初始占空比为 7.5% ( 96 ),舵机正对正前方
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);
- //![单通道 Timer_A 例子]
- //使能中断并开启看门狗定时器
- MAP_Interrupt_enableInterrupt(INT_PORT1);
- MAP_Interrupt_enableSleepOnIsrExit();
- MAP_Interrupt_enableMaster();
- //Enabling SRAM Bank Retention
- MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK1);
- //使能全局中断
- MAP_Interrupt_enableMaster();
- //进入睡眠模式,中断唤醒
- while (1)
- {
- MAP_PCM_gotoLPM0();
- }
- }
- /* GPIO中断服务程序 */
- /* 在中断中进行列扫描判断哪个按键按下,中断结束将所有列置为0,方便下一次进入中断。 */
- void PORT5_IRQHandler(void)
- {
- uint32_t status1; //设置一个状态标志量,寄存中断情况
- status1 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P5);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, status1); //清零所有中断标志位
- //判断第一列按键是否按下,按下输入为0
- LowC1;
- HighC2;
- HighC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) ) //S5按下
- {
- pwmConfig.dutyCycle = 144;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约2.25ms,占空比为11.25%,舵机左转67.5°
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN2)) ) //S9按下
- {
- pwmConfig.dutyCycle = 160;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约2.5ms,占空比为12.5%,舵机左转90°
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6)) ) //S13按下
- {
- pwmConfig.dutyCycle = 175;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约2.73ms,占空比为13.7%,舵机左转112.5°
- }
- //判断第二列按键是否按下,按下输入为0
- HighC1;
- LowC2;
- HighC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) ) //S6按下
- {
- pwmConfig.dutyCycle = 96;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约1.5ms,占空比为7.5%,舵机正对正前方
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN2)) ) //S10按下
- {
- pwmConfig.dutyCycle = 180;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约2.8ms,占空比为14.1%,舵机一直左转
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6)) ) //S14按下
- {
- pwmConfig.dutyCycle = 0;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //0ms,占空比为0%,舵机不动
- }
- //判断第三列按键是否按下,按下输入为0
- HighC1;
- HighC2;
- LowC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) ) //S7按下
- {
- pwmConfig.dutyCycle = 96;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约1.5ms,占空比为7.5%,舵机正对正前方
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN2)) ) //S11按下
- {
- pwmConfig.dutyCycle = 10;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约0.156ms,占空比为0.78%,舵机一直右转
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6)) ) //S15按下
- {
- pwmConfig.dutyCycle = 0;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //0ms,占空比为0%,舵机不动
- }
- //判断第四列按键是否按下,按下输入为0
- HighC1;
- HighC2;
- HighC3;
- LowC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) ) //S8按下
- {
- pwmConfig.dutyCycle = 48;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约0.75ms,占空比为3.75%,舵机右转67.5°
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN2)) ) //S12按下
- {
- pwmConfig.dutyCycle = 32;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约0.5ms,占空比为2.5%,舵机右转90°
- }
- else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6)) ) //S16按下
- {
- pwmConfig.dutyCycle = 16;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约0.25ms,占空比为1.25%,舵机右转112.5°
- }
- //所有列置0,方便下一次进入中断
- LowC1;
- LowC2;
- LowC3;
- LowC4;
- }
- void PORT6_IRQHandler(void)
- {
- uint32_t status2; //设置一个状态标志量,寄存中断情况
- status2 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P6);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P6, status2); //清零所有中断标志位
- //判断第一列按键是否按下,按下输入为0
- LowC1;
- HighC2;
- HighC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) ) //S1按下
- {
- pwmConfig.dutyCycle = 128;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约2ms,占空比为10%,舵机左转45°
- }
- //判断第二列按键是否按下,按下输入为0
- HighC1;
- LowC2;
- HighC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) ) //S2按下
- {
- pwmConfig.dutyCycle = 112;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约1.75ms,占空比为8.75%,舵机左转22.5°
- }
- //判断第三列按键是否按下,按下输入为0
- HighC1;
- HighC2;
- LowC3;
- HighC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) ) //S3按下
- {
- pwmConfig.dutyCycle = 80;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约1.25ms,占空比为6.25%,舵机右转22.5°
- }
- //判断第四列按键是否按下,按下输入为0
- HighC1;
- HighC2;
- HighC3;
- LowC4;
- if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) ) //S4按下
- {
- pwmConfig.dutyCycle = 64;
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); //大约1ms,占空比为5%,舵机右转45°
- }
- //所有列置0,方便下一次进入中断
- LowC1;
- LowC2;
- LowC3;
- LowC4;
- }
- //每按一次S1按键,高电平所占时间大约+0.125ms,占空比+0.625%,舵机左转+11.25°
- void PORT1_IRQHandler(void)
- {
- uint32_t status3 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
- MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status3);
- if (status3 & GPIO_PIN1)
- {
- if(pwmConfig.dutyCycle >= 200) //超过3.125ms,占空比超过15.625%,占空比清零
- pwmConfig.dutyCycle = 0;
- else
- pwmConfig.dutyCycle += 8; //每按一次S1按键,大约+0.125ms,占空比+0.625%,舵机左转+11.25°
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);
- }
- }
复制代码
6.工程文件及舵机资料
CCS工程和SG90舵机资料.zip
(2.15 MB, 下载次数: 120)
|