历史上的今天
今天是:2025年01月21日(星期二)
2020年01月21日 | 基于STC15单片机芯片的直流电机PID控制转速源码
2020-01-21 来源:51hei
STC15W4K56S4单片机PID控制直流电机转速
下面是制作出来的实物图:
电机上电运行平稳

L298N控制电机转速

STC控制板
单片机源程序如下:
#include "STC15W4K56S2.h"
#include "Counter1.h"
#include "USART.h"
#include "TIMER.h"
#include "PWM_CONTR.h"
#define u8 unsigned char
#define u16 unsigned int
u16 Speed_Temp=0;
sbit Led=P5^5;
struct _Pid{
u8 SetSpeed; //设置值
u8 ActualSpeed; //实际值
int err;
int err_next;
int err_last;
float Kp,Kd,Ki;
}pid;
void Seial_Creat(void);
void Timer_Creat(void);
void PID_Init(void);
u8 PID_Motor(u8 speed, u8 Aurespeed);
void main()
{
Counter1_config();
Seial_Creat();
Timer_Creat();
pwm_Init();
PID_Init();
Led=1;
EA=1;
while(1);
}
void Seial_Creat(void)
{
COMx_InitDefine myComx_initdefine;
myComx_initdefine.UART_Mode=UART_8bit_BRTx;
myComx_initdefine.UART_BRT_Use=BRT_Timer2;
myComx_initdefine.UART_BaudRate=9600;
myComx_initdefine.Morecommunicate=DISABLE;
myComx_initdefine.UART_RxEnable=ENABLE;
myComx_initdefine.BaudRateDouble=DISABLE;
myComx_initdefine.UART_Interrupt=DISABLE;
myComx_initdefine.UART_P_SW=UART1_SW_P30_P31;
myComx_initdefine.UART_RXD_TXD_Short=DISABLE;
USART_Configuration(USART1, &myComx_initdefine);
}
void Timer_Creat(void)
{
TIM_InitTypeDef myTim_inittypedef;
myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload;
myTim_inittypedef.TIM_Polity=0;
myTim_inittypedef.TIM_Interrupt=ENABLE;
myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T;
myTim_inittypedef.TIM_ClkOut=DISABLE;
myTim_inittypedef.TIM_Value=63900;
myTim_inittypedef.TIM_Run=ENABLE; //TR0=1
Timer_Inilize(Timer0,&myTim_inittypedef);
}
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
static u8 Count1=0;
static u8 Count2=0;
u8 Speed_pwm;
if(Count1==10)
{
TR1=0;
Count1=0;
Speed_Temp+=TL1;
Count2++;
if(Count2==4)
{
Speed_Temp>>=2;
Speed_Temp=(Speed_Temp*50)/40;
Speed_pwm=PID_Motor(20, Speed_Temp);
pwm_Change(Speed_pwm, 0x80);
//pwm_Change(0x80, 0x80);
Send1_onedata(0xaa); //发个字节标志位
Send1_onedata((u8)Speed_Temp);
Send1_onedata(Speed_pwm);
Speed_Temp=0;
Count2=0;
}
Led=~Led;
TH1=0;
TL1=0;
TR1=1;
}
else
{
Count1++;
}
}
void PID_Init(void)
{
pid.SetSpeed=0;
pid.ActualSpeed=0;
pid.err=0;
pid.err_next=0;
pid.err_last=0;
pid.Kp=2;
pid.Kd=0.2;
pid.Ki=4;
}
u8 PID_Motor(u8 speed, u8 Aurespeed)
{
int incrementspeed;
static u8 speed_value;
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-Aurespeed;
incrementspeed=pid.Kp*(pid.err-pid.err_next)+pid.Kd*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
speed_value+=incrementspeed;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
return (255-speed_value);
}
史海拾趣
|
嵌入式开发的最大一个特点就是与应用结合紧密,但是这个“紧密”到什么程度? 据我了解,按照软件工程的软件开发流程,第一步要确定应用领域,然后选硬件,操作系统,开发工具等,最后才是软件开发。 这个步骤没有错,但是第一步确定应用领域详细 ...… 查看全部问答> |
|
想用舵机做一个指针式的仪表,无奈市面上的普通舵机都是180度的,不能满足表面的要求; 看到有卖一种360度旋转电机,但是这种电机的相关资料很少; 我已经了解并实现了180度的舵机, 所以请问下,这种电机还是用1-2MS的高电平脉冲来控制角度吗? 跟普通 ...… 查看全部问答> |
|
代码大致如下: int main() { ... /*此处设置一断点 ... while(1); return 0; } 这段代码非常简单,我在main函数第一行设置了个断点,以 ...… 查看全部问答> |
|
诸如dm9000网卡芯片,怎么设置寄存器可以收到自己发送的数据包? 曾今也看过网络编程,发现只要往127.0.0.1发送,就能够本机收到,或者直接发数据包给自己的IP地址,也是能够接收。我自己做了一块网卡,然后自己也开发了简单的TCP/IP协议栈,数据包的收发已经做完了,两台网络上的机器对法都能收到。二现在我想给 ...… 查看全部问答> |
|
《AlientekSTM32例程手册》28个实验连载-看门狗 独立看门狗实验: ALIENTEK MINISTM32 实验5 独立看门狗实验.rar (814.62 KB) 下载次数: 328 2010-11-10 00:48 独立看门狗实验.pdf (406.95 KB) 下载次数: 221 2010-11-10 00:48 窗口看门狗实验: ...… 查看全部问答> |
|
什么是加速度传感器? 加速度传感器是一种能够测量加速力的电子设备。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。加速力可以是个常量,比如g,也可以是变量。 加速度传感器一般用在哪里? 通过测量由于重力引 ...… 查看全部问答> |




