历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2020年01月21日 | 基于STC15单片机芯片的直流电机PID控制转速源码

2020-01-21 来源:51hei

STC15W4K56S4单片机PID控制直流电机转速

下面是制作出来的实物图:

电机上电运行平稳

电机上电运行平稳

L298N控制电机转速

L298N控制电机转速

STC控制板

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);

}

推荐阅读

史海拾趣

岑科(CENKER)公司的发展小趣事

随着生产规模的扩大,岑科在2010年将制造板块迁移至广西,以进一步优化企业资源配置。这一举措不仅降低了生产成本,还提高了生产效率。同时,岑科加速了自主创新和技术进步的步伐,不断推出更具竞争力的电子产品。在这一阶段,岑科的产品质量和性能得到了市场的广泛认可,客户满意度也持续提升。

Harvatek Corporation公司的发展小趣事

背景:作为电子显示领域的佼佼者,Hantronix不仅关注自身的发展,还积极履行社会责任,为行业的进步和发展做出贡献。

发展:Hantronix通过技术创新和产品升级,推动了电子显示技术的进步和应用范围的扩大。同时,公司还积极参与行业标准的制定和推广工作,为行业的规范化、标准化发展贡献了自己的力量。此外,Hantronix还注重人才培养和团队建设,为行业培养了一大批高素质的专业人才。

以上五个故事虽然基于概括性描述,但均反映了Hantronix公司在电子行业中的发展历程、技术创新、市场拓展、品质保证以及行业影响等方面的实际情况。

珠海艾派克(APEXMIC)公司的发展小趣事

为了进一步提升研发实力,艾派克先后在珠海、上海、杭州和美国北卡罗来纳州建立了四大研发中心,并与浙江大学、中科院上海微系统所等国内外知名机构建立联合实验室。这些举措不仅加强了公司在技术研发方面的国际合作,也推动了艾派克在行业技术前沿的领先地位。

Guerrilla RF公司的发展小趣事
电动机驱动电路故障还可能导致硬盘在运行时产生异常的噪音。
DESCO公司的发展小趣事

为了进一步提升竞争力,DESCO公司进行了多次收购和资源整合。例如,在XX年,公司成功收购了美国一家知名的防静电产品制造商,获得了其先进的生产技术和销售渠道。这次收购使DESCO公司的产品线更加丰富,市场覆盖面更加广泛。此外,公司还加强了与其他企业的战略合作,共同开发新产品、拓展新市场。

Clover Display Limited公司的发展小趣事

技术创新是Clover Display Limited得以持续发展的核心动力。公司高度重视研发团队的建设,不仅在香港设立了一支强大的研发团队,还不断引进国内外优秀人才。这些研发人员致力于开发液晶显示器(LCD)及液晶显示屏(LCM)的新应用,为公司带来了众多具有市场竞争力的产品。在他们的努力下,Clover Display Limited在液晶显示技术领域取得了多项突破,为公司的快速发展奠定了坚实基础。

问答坊 | AI 解惑

求助8051f340和AD7732

哪位大虾用过8051f340和AD7732,我想用单片机控制AD,没弄明白啊,想用SPI…

查看全部问答>

最近要申请一个科创的项目,大家来帮下忙

我是电气工程的学生,大家有什么好的创意和想法,请不吝惜的告诉我。或者有什么热门的项目可以来申报…

查看全部问答>

嵌入式应用软件开发流程

嵌入式开发的最大一个特点就是与应用结合紧密,但是这个“紧密”到什么程度? 据我了解,按照软件工程的软件开发流程,第一步要确定应用领域,然后选硬件,操作系统,开发工具等,最后才是软件开发。 这个步骤没有错,但是第一步确定应用领域详细 ...…

查看全部问答>

360度连续旋转舵机与普通舵机

想用舵机做一个指针式的仪表,无奈市面上的普通舵机都是180度的,不能满足表面的要求; 看到有卖一种360度旋转电机,但是这种电机的相关资料很少; 我已经了解并实现了180度的舵机, 所以请问下,这种电机还是用1-2MS的高电平脉冲来控制角度吗? 跟普通 ...…

查看全部问答>

刚接触嵌入式开发,有段代码不懂,怀疑中。。。

代码大致如下: int main() {    ...    /*此处设置一断点        ...    while(1);        return 0; } 这段代码非常简单,我在main函数第一行设置了个断点,以 ...…

查看全部问答>

困惑已久的地址问题

刚上手WINCE,做一个CAMERA方面的驱动,主要是将inputbuffer中的数据通过驱动转换为outputbuffer,而且inputbu和outputbu都需要和应用程序交互,中间就有一些地址的映射转换。现在是被这些地址搞糊涂了。向各位大侠请教:    首先程序里 ...…

查看全部问答>

诸如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 窗口看门狗实验: ...…

查看全部问答>

【为C2000做贡献】基于DSP的数字滤波的仿真和实现

基于DSP的数字滤波的仿真和实现,PDF格式,还有一个视频,可是网址附近不能超过15M,传不上去…

查看全部问答>

加速度传感器原理以及选用

什么是加速度传感器? 加速度传感器是一种能够测量加速力的电子设备。加速力就是当物体在加速过程中作用在物体上的力,就好比地球引力,也就是重力。加速力可以是个常量,比如g,也可以是变量。 加速度传感器一般用在哪里? 通过测量由于重力引 ...…

查看全部问答>