PID控制器使用MATLAB软件设计师和arduino直流电机

40视图(30天)
你好,我是工作在这个项目展示PID直流电机上的影响
所以我使用MATLAB软件设计师和arduino
因此,我有arduino代码来驱动直流电机和编码器和PID控制器,
但问题是我是一个新手MATLAB应用程序设计师编码
所以我请求帮助我与MATLAB程序代码视图
我。e我想发送一些值的设置速度,P, I, D值通过串行通讯端口和接收速度在rpm arduino电路板和显示num箱规
所以请帮助我一样
简化这个问题我必须只发送值arduino电路板和接收汽车MATLAB应用程序的速度。
请参阅arduino程序,请帮助运行这个代码使用MATLAB gui或MATLAB程序设计代码视图。
/ *
电动机- PID的速度控制
(1)接收命令从Visual Studio(通过COM1): set_speedkP、kI kD
(2)控制电动机转速通过PWM(脉宽调制是基于PID计算)
(3)发送pv_speed Visual Studio - >显示在图* /
字符串神秘岛= " ";
字符myChar;
布尔stringComplete = false;/ /是否字符串是完整的
布尔motor_start = false;
常量字节pin_a = 2;/ /编码器脉冲一个
常量字节pin_b = 3;/ /编码器脉冲B
常量字节pin_fwd = 4;/ /h桥:电机运行向前
常量字节pin_bwd = 5;/ /h桥:电机运行落后的
常量字节pin_pwm = 6;/ /h桥:电动机转速
int编码器= 0;
intm_direction = 0;
intsv_speed = 100;/ /这个值是0 ~ 255
pv_speed = 0;
set_speed = 0;
e_speed = 0;/ /错误的速度= set_speed - pv_speed
e_speed_pre = 0;/ /最后一次错误的速度
e_speed_sum = 0;/ /金额错误的速度
pwm_pulse = 0;/ /这个值是0 ~ 255
kp = 0;
ki = 0;
kd = 0;
inttimer1_counter;/ /计时器
int我= 0;
无效设置(){
pinMode (pin_a INPUT_PULLUP);
pinMode (pin_b INPUT_PULLUP);
pinMode (pin_fwd、输出);
pinMode (pin_bwd、输出);
pinMode (pin_pwm、输出);
attachInterrupt (digitalPinToInterrupt (pin_a)、detect_a上升);
/ /开始连续港口在9600个基点:
Serial.begin (9600);
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - -计时器设置
noInterrupts ();/ /禁用所有中断
TCCR1A = 0;
TCCR1B = 0;
timer1_counter = 59286;/ /预加载计时器65536 - 16 - mhz / 256/2Hz 0.5秒(34286)0.1秒(59286)
TCNT1 = timer1_counter;/ /预加载计时器
TCCR1B| = (1 < < CS12);/ / 256预定标器
TIMSK1| = (1 < < TOIE1);/ /启用定时器溢出中断
中断();/ /让所有中断
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - -计时器设置
(!串行){
;/ /等待串行端口连接。需要本地USB端口
}
analogWrite (pin_pwm 0);/ /停止电机
digitalWrite (pin_fwd 0);/ /停止电机
digitalWrite (pin_bwd 0);/ /停止电机
}
无效循环(){
如果(stringComplete) {
/ /清除字符串当COM接收完成
神秘岛=”“;/ /注意:在代码中下面,神秘岛不会成为空白,神秘岛是空白的,直到收到“\ n”
stringComplete = false;
}
/ /接收命令从Visual Studio
如果(mySt.substring (0,8) = =“vs_start”){
digitalWrite (pin_fwd, 1);/ /运行电动机向前跑
digitalWrite (pin_bwd 0);
motor_start = true;
}
如果(mySt.substring (0、7) = =“vs_stop”){
digitalWrite (pin_fwd 0);
digitalWrite (pin_bwd 0);/ /停止电机
motor_start = false;
}
如果12 (mySt.substring (0) = =“vs_set_speed”){
mySt.length set_speed = mySt.substring(12日()).toFloat ();/ /获取字符串set_speed后
}
如果(mySt.substring (0 5) = =“vs_kp”){
kp = mySt.substring (5, mySt.length ()) .toFloat ();/ /获取字符串vs_kp后
}
如果(mySt.substring (0 5) = =“vs_ki”){
ki = mySt.substring (5, mySt.length ()) .toFloat ();/ /获取字符串vs_ki后
}
如果(mySt.substring (0 5) = =“vs_kd”){
kd = mySt.substring (5, mySt.length ()) .toFloat ();/ /获取字符串vs_kd后
}
}
无效detect_a () {
编码器+ = 1;/ /增加编码器在新脉冲
m_direction = digitalRead (pin_b);/ /读方向电机
}
ISR (TIMER1_OVF_vect) / /中断服务常规——蜱虫每0.1秒
{
TCNT1 = timer1_counter;/ /设置定时器
pv_speed = 600.0 * 200.0(编码器/)/ 0.1;/ /计算电机转速,单位是rpm
编码器= 0;
/ /打印速度
如果(Serial.available () < = 0) {
并同时“速度”);
以pv_speed);/ /打印速度(rpm)值到Visual Studio
}
/ / PID程序
如果(motor_start) {
e_speed = set_speed - pv_speed;
pwm_pulse = e_speed * kp + e_speed_sum * ki + (e_speed - e_speed_pre) * kd;
e_speed_pre = e_speed;/ /保存最后的(以前的)错误
e_speed_sum+ = e_speed;/ /笔错误
如果(e_speed_sum > 4000) e_speed_sum = 4000;
如果(e_speed_sum < -4000) e_speed_sum = -4000;
}
其他的{
e_speed = 0;
e_speed_pre = 0;
e_speed_sum = 0;
pwm_pulse = 0;
}
/ /更新新速度
如果(pwm_pulse < 255 & pwm_pulse > 0) {
analogWrite (pin_pwm pwm_pulse);/ /设置电机速度
}
其他的{
如果(pwm_pulse > 255) {
analogWrite (pin_pwm, 255);
}
其他的{
analogWrite (pin_pwm 0);
}
}
}
无效serialEvent () {
(Serial.available ()) {
/ /得到新的字节:
字符inChar = (char) Serial.read ();
/ /添加它inputString:
如果(inChar ! =' \ n '){
神秘岛+ = inChar;
}
/ /如果传入的性格是一个换行符,设置一个标志
/ /所以主循环能做些什么:
如果(inChar = =' \ n '){
stringComplete = true;
}
}
}
基本上与visual studio接口但现在希望与matlab的接口。

答案(0)

类别

找到更多的在应用程序构建帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!