CS231N学习——1.1学习目标

目标计划

斯坦福大学的用于视觉识别的卷积神经网络,课程代码CS231N,

课程主页

请参考http://cs231n.stanford.edu/index.html

官方笔记

请参考http://cs231n.github.io/

教学大纲syllabus

请参考http://cs231n.stanford.edu/syllabus.html

视频资源

可以到B站,或者网易的MOOC观看。B站的资源为:https://www.bilibili.com/video/av28144535。为了防止河蟹,建议自己下载。

作业

可以参考斯坦福大学的CS231N,我的计划是参考http://cs231n.stanford.edu/2017/

语言

Python

使用环境

Jupyter Notebook

工作计划

1、搭建Ipython Notebook。之所以选择自己搭建Jupyter Notebook服务器,一是进一步了解Jupyter Notebook,二是永久保存自己的作业。

2、学习Python。本人没有系统学习过Python。

<think>嗯,用户之前对比了MSP430和Cortex-M0的性能差异,现在具体想用MSPM0G3507控制小车电机。用户引用了自己之前使用编码器效果不理想的经历,决定改用纯PWM控制,但遇到了直线行走偏差问题。这说明用户正处于实际调试阶段,核心需求是解决小车走不直的问题,同时实现基本的前进转弯功能。用户提供的引用内容很关键:1)放弃编码器改用PWM开环控制;2)遇到摩擦力导致走偏;3)用IMU的yaw角做PID闭环修正。这验证了之前架构对比时的预判——无传感器的开环控制在低端微控制器上确实存在精度问题。不过用户已经找到了替代方案(IMU反馈),现在需要的是具体实现代码。注意到用户明确要求使用CCS开发环境、L298N驱动器和双电机控制,代码框架应该包含:GPIO初始化(按键控制)、PWM模块配置(Timer_A)、IMU数据读取(I2C)、PID计算、转向控制逻辑。特别要注意的是,用户提到初始yaw角校准需要留1°余量,这提示PID参数需要保留调试接口。硬件连接方面,L298N的IN1-IN4需要对应MSPM0G3507的PWM输出引脚,IMU的I2C接口也要预先确认。代码示例需要强调:1)Timer_A的UP模式配置;2)死区时间虽未提但L298N需要逻辑互锁;3)转向时的差速算法实现(参考用户引用的“简单转向控制环”描述)。最后生成的问题要聚焦在调试痛点:IMU校准和参数整定显然是用户下一步要面临的挑战,机械结构影响也是实际部署时的常见问题。补充电磁兼容问题是预防电机干扰导致控制失效的潜在风险。</think> 以下是使用CCS开发环境在MSPM0G3507上控制L298N驱动双电机的完整代码实现,结合您描述的转向控制方案: ### 代码框架 ```c #include "driverlib.h" // 电机控制引脚定义 #define MOTOR1_PWM_PIN GPIO_PORT_P1, GPIO_PIN0 // P1.0 -> Timer_A PWM1 #define MOTOR1_IN1_PIN GPIO_PORT_P2, GPIO_PIN0 // IN1 #define MOTOR1_IN2_PIN GPIO_PORT_P2, GPIO_PIN1 // IN2 #define MOTOR2_PWM_PIN GPIO_PORT_P1, GPIO_PIN1 // P1.1 -> Timer_A PWM2 #define MOTOR2_IN3_PIN GPIO_PORT_P2, GPIO_PIN2 // IN3 #define MOTOR2_IN4_PIN GPIO_PORT_P2, GPIO_PIN3 // IN4 #define KEY_PIN GPIO_PORT_P1, GPIO_PIN3 // 按键 // PID参数 float kp = 0.5, ki = 0.01, kd = 0.05; float setpoint = 1.0; // 初始目标偏航角(参考[^1]中提到的经验值) float integral = 0, prev_error = 0; void main(void) { WDT_A_hold(WDT_A_BASE); // 关闭看门狗 // 初始化时钟 PCM_setCoreVoltageLevel(PCM_VCORE1); CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24); // GPIO初始化 GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3); GPIO_setAsInputPinWithPullUpResistor(KEY_PIN); // 初始化PWM (Timer_A0) TA0CCR0 = 1000-1; // PWM周期 = 24MHz / 1000 = 24kHz TA0CCTL1 = OUTMOD_7; // 复位/置位模式 TA0CCTL2 = OUTMOD_7; TA0CTL = TASSEL__SMCLK | MC__UP | TACLR; GPIO_setAsPeripheralModuleFunctionOutputPin(MOTOR1_PWM_PIN | MOTOR2_PWM_PIN); // 初始化IMU (示例用I2C接口) I2C_init(); IMU_calibrate(); while(1) { if (!GPIO_getInputPinValue(KEY_PIN)) { setpoint = getYaw(); // 按键校准初始方位[^1] __delay_cycles(48000); // 延时消抖 } float actual_yaw = getYaw(); // 从IMU获取当前偏航角 runPIDControl(actual_yaw); // 执行转向控制 } } // PID控制函数 void runPIDControl(float measurement) { float error = setpoint - measurement; integral += error; float derivative = error - prev_error; float correction = kp*error + ki*integral + kd*derivative; // 差速转向 (保持总功率不变) setMotorSpeed(0, 800 + correction*10); // 电机0 setMotorSpeed(1, 800 - correction*10); // 电机1 prev_error = error; } // 电机控制函数 void setMotorSpeed(uint8_t motor, uint16_t duty) { duty = __min(__max(duty, 0), 980); // 限幅10%-98% if(motor == 0) { GPIO_setOutputHighOnPin(MOTOR1_IN1_PIN); // IN1=1, IN2=0 正转 GPIO_setOutputLowOnPin(MOTOR1_IN2_PIN); TA0CCR1 = duty; // PWM占空比 } else { GPIO_setOutputHighOnPin(MOTOR2_IN3_PIN); // IN3=1, IN4=0 正转 GPIO_setOutputLowOnPin(MOTOR2_IN4_PIN); TA0CCR2 = duty; } } // 基础运动函数 void moveForward(void) { setMotorSpeed(0, 800); setMotorSpeed(1, 800); } void turnRight(uint16_t speedDiff) { setMotorSpeed(0, 800 + speedDiff); setMotorSpeed(1, 800 - speedDiff); } ``` ### 关键实现说明: 1. **差速转向原理** - 两电机基准PWM相同:$V_{base} = 800$ - PID输出校正量:$\Delta V = K_p e + K_i \int e dt + K_d \frac{de}{dt}$ - 实际输出: $$V_{left} = V_{base} + \Delta V$$ $$V_{right} = V_{base} - \Delta V$$ 2. **L298N控制逻辑** | 运动方向 | IN1 | IN2 | IN3 | IN4 | PWM | |----------|-----|-----|-----|-----|-----| | 正转 | 1 | 0 | 1 | 0 | ✓ | | 反转 | 0 | 1 | 0 | 1 | ✓ | | 刹车 | 1 | 1 | 1 | 1 | - | 3. **转向控制优化** - 偏航角零位校准通过按键触发[^1] - PID输出限幅防止过冲: $$ \Delta V_{max} = \pm 150 \quad (\text{占空比变化范围}) $$ - 积分抗饱和处理(代码中省略,实际需添加) 4. **参数调校建议** ```c // 调试步骤: // 1. 先置ki=0, kd=0 // 2. 增大kp直至小车出现轻微振荡 // 3. 将kp设为振荡临界值的50% // 4. 缓慢增加ki消除稳态误差 ``` ### 接线示意图 ``` MSPM0G3507 L298N模块 P1.0 (TA0.1) → ENA (PWM输入1) P2.0 → IN1 P2.1 → IN2 P1.1 (TA0.2) → ENB (PWM输入2) P2.2 → IN3 P2.3 → IN4 VCC → +5V (逻辑供电) GND → GND (共地) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值