c - 伺服电机在 Proteus 中无法正常移动
问题描述
我正在尝试使用 PIC18f4550 控制伺服电机,但在购买之前,我试图在 Proteus ISIS 上对其进行模拟,但在设置角度时出现了一些不一致。
我尝试使用 20ms 周期和 1ms、1.167ms、1.333ms、1.5ms、1.667ms 或 1.833ms 占空比,它会在 Proteus MOTOR-PWMSERVO 上产生 -69.8° 角,但使用 2ms 占空比会导致完整的 90.0° 角
#define CONTROL PORTCbits.RC0
#define BUTTON PORTCbits.RC1
const Ang_Neg90 = 1.0;
const Ang_Neg60 = 1.167;
const Ang_Neg30 = 1.333;
const Ang_0 = 1.5;
const Ang_30 = 1.667;
const Ang_60 = 1.833;
const Ang_90 = 2.00;
// ------------------------------------------------- //
void ServoPosition (unsigned float Angle) {
CONTROL = 1;
Delay_ms(Angle);
CONTROL = 0;
Delay_ms(20 - Angle);
}
void main(){
while(1){
ServoPosition(Ang_0);
if (BUTTON == 1){
break;
while(1){
ServoPosition(Ang_90);
}
}
}
}
我希望我的程序能够从 0 度变为 90 度,但我得到的只是 -69.8 到 90。关于我出错的任何想法吗?
解决方案
如果没有看到您的整个设置,很难判断,所以这里列出了它可能是的东西。
检查模拟伺服设置
确保将其设置为默认值。
使用示波器工具测量您的 PWM 信号
爱好伺服电机示例展示了如何使用示波器工具。将示波器连接到您的 pic18f4550 PWM 输出并测量它以确保占空比正确。你在低端遇到问题(试图达到 1ms)所以我怀疑示波器会显示你的占空比太长。
如果您发现您的工作周期太长,您可以尝试:
- 减去一个软糖值以处理模拟中存在的任何衰减时间。在真实硬件上运行时,您可能必须使用不同的值。
- 在 pic18f4550 上使用专用 PWM 模块。这可能是最好的解决方案,因为您可以设置 PWM 寄存器(假设它是这样工作的……我没有仔细查看手册),然后让它为您控制占空比。
检查电压
Hobby Server 中的电池是 6V,但 5V 似乎也可以工作。低于这个值,它开始表现得很奇怪。
推荐阅读
- android - 什么是创建一起滚动的行并且由在Android上具有相同高度的可变大小的可点击视图组成的最简单的方法
- reactjs - 这种卡片导航可以用 React Native 实现吗?
- python - 为什么我的 python 磁力计校准代码不适用于软铁干扰?
- c - 在 BST (c) 中搜索字符串
- php - SQLSTATE [42S22]:找不到列:1054 'on 子句'中的未知列 '2'
- python - 除非按下 ctrl 键,否则 Python Tkinter 不会完全加载
- php - json_decode() 开始返回 NULL
- node.js - Gatsby serve - 初始渲染时画布出现问题
- vue.js - 在 VUE 项目中显示 HTML 文件
- java - 为什么 cxf-codegen maven 插件无法在 OpenJDK 10 上运行 wsdl2java 目标?(已回答)