STCunio真正的数字电源带PID数字闭环
PID库3.9.1pidbegin(int a,int b,int c)
概述
pidbegin函数的作用是将a、b、c三个参数进行赋值,这三个参数的定义参考上述内容。一般的kp、ki、kd是浮点数,那么a、b、c也是浮点型,所以要在使用pidbegin函数之前需要将a、b、c三个参数进行Q15格式化,即左移15次转换成int,最后我们只需将结果右移15次即可还原。如果使用浮点数来进行PID运算也是可以的,但是浮点数运算会占用大量的时间和存储空间,无论是MCU还是DSP选择整型运算要比浮点运算优越很多。
语法
pidbegin(int a,int b,int c)
参数
a:Q15(Kp + Ki + Kd),int型
b:Q15(-(Kp + 2*Kd),int型
c:Q15(Kd),int型
返回值
无
示例
#define PID_BOOST_KP 0.23
#define PID_BOOST_KI 0.03
#define PID_BOOST_KD 0.00
#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))
#define PID_BOOST_A Q15(PID_BOOST_KP + PID_BOOST_KI + PID_BOOST_KD)
#define PID_BOOST_B Q15(-1 *(PID_BOOST_KP + 2 * PID_BOOST_KD))
#define PID_BOOST_C Q15(PID_BOOST_KD)
pidbegin(PID_BOOST_A,PID_BOOST_B,PID_BOOST_C);
3.9.2 pid(int referenceInput,int measuredOutput)
概述
pid就是PID控制算法的核心运算,必须要有参数值和测试值来产生误差,最后返回PID计算结果。在使用PID的结果时需将其右移15位给控制输出,同时根据需要,设置控制输出的上下限值。
语法
pid(int referenceInput,int measuredOutput)
参数
referenceInput:参考输入值,int型
measuredOutput:参考输入值,int型
返回值
long型
郑重声明:MCS-51单片机有112条指令,而不是111条指令,这条未公布指令的机器码就是0xA5,作用是跳过下一个字节,在汇编程序里可以用 “DB 0A5H”作为指令使用。欢迎加入STCunio Studio QQ群:117112538,参与更多的技术交流。
STC单片机开发板、新一代开源硬件,对于创客,它是您创作的好伙伴,无单片机基础也能学会;对于电子工程师或学生,它是您提升能力的好法宝,重基础,重方法。
STCunio,即system on chip unusual i/o,采用类似arduino构架设计,即使没有单片机知识的设计师和艺术家们能够很快地通过它学习电子和传感器的基础知识,并应用到他们的设计当中。设计中所要表现的想法和创意才是最主要的,至于单片机如何工作,设计师和艺术家们并不需要考虑。
本产品采用STC新推出的单片机为核心,为响应众多的开发者和学生的要求,尤其是非电子专业的爱好者,STCunio开发团队设计出一款类似arduino uno的学习板,取名为STCunio R1,STCunio R1引脚排列兼容arduino官方学习板,代码开源,并且供电兼容3.3V和5V。
STCunio R1具有一下特点:
1. STCunio R1具备自动下载功能
不像其他学习板那样需要用一个带自锁的开关来软启动才能下载程序,软启动即将MCU停电再将其上电。如果我们在调试程序当中若采用这种软启动方式下载程序会觉得有点麻烦了。还有一种市面上采用继电器的方式来控制MCU的VCC来实现软启动,这是当ISP发送下载序列时,串口的DTS发一个跳变的信号,通过捕捉这个信号来控制继电器,这种方法也是有弊端的,假如我们通过串口助手发送一个数据给单片机,那么继电器同样会动作,这样并不是我们所希望的。那么STCunio R1自动下载的原理到底是什么呢?
其实原理非常简单,将串口设置为8位数据、中断模式,当ISP下载程序时会有个下载序列,其实是很多个0x7f,当MCU接收0x7f至少16次以上时,这时MCU认为是下载命令,将寄存器IAP_CONTR赋值0X60,那么系统就会跳到ISP监控程序区,这个区是STC厂家做的固件,MCU软启动之后也会进入这个区检测下载流,之后才会进入用户代码区。当然这是要编写一点简单的代码,代码已经编写好在USART1.c中,这个代码我们称之为bootloader,在每次下载程序的时候都把bootloader加到程序中即可,此外我们要在main()函数中加“Serialbegin(2400);”,操作简单吧。
有两点需要注意的:
1ISP界面有“最低波特率”,当我们每次打开ISP时最低波特率默认是2400,如果要选择更高的波特率,比如115200,那么我们只需要在Serialbegin ()函数中修改的参数改成115200。
2系统时钟的设置,当我们使用不同的系统时钟只需在config.h中设置MAIN_Fosc,这个是由宏来定义的。
以上两点如果没有设置对,那么就实现不了自动下载。学习板上既然没有自锁开关,那MCU怎么来软启动呢?这里我们也有考虑到,做了一个电子开关来控制MCU的VCC,电子开关由一个轻触按键来控制,这种实现软启动的方法也比用自锁开关开发方便,只需轻轻一按就可以实现软启动。
2. C语言程序开发,没有C语言基础的学者也不用担心,只要稍微学习一下就会用了。
STCunio是开源的,并且大家可以在库函数里进行修改、升级。
STCunio函数库
3.1数字IO
3.1.1 pinMode(pin,mode)
3.1.2digitalWrite(pin,value)
3.1.3pinInvert(pin)
3.1.4digitalRead(pin)
3.2模拟IO
3.2.1 analogRead(analogPin)
3.2.2 analogWrite(pin,u8 value,u8 PCA_Clock_xT)
3.3高级IO
3.3.1 tone(pin,u16 frequency)
3.3.2 noTone(pin)
3.3.3 shiftOut(dataPin, clockPin, bitOrder, u8 value)
3.3.4shiftIn(dataPin, clockPin, bitOrder)
3.4时间函数
3.4.1 delay_ms(u32 ms)
3.4.2delay_10us(u16 _10us)
3.5位操作
bitRead(value, bit)
bitSet(value, bit)
bitClear(value,bit)
3.6串口
3.6.1Serialbegin(u32 baud)
3.6.2stdio.h常用库函数
3.7SPI接口
3.7.1SPIbegin()
3.7.2SPIsetBitOrder(u8 bitOrder)
3.7.3SPIsetClockDivider(u8 rate)
3.7.4 SPIsetDataMode(u8 mode)
3.7.5 SPItransfer(u8 _data)
3.8数学函数
3.9PID
3.9.1pidbegin(int a,int b,int c)
3.9.2 pid(int referenceInput,int measuredOutput)
机器人优秀的控制算法怎么能少得了PID控制算法呢
此外还有其他模块的库函数
步进电机的
void steppersetSpeed(u16 rpms);
Stepperstepper(int steps,pin1,pin2,pin3,pin4);
void step(int steps);
舵机的
void servoWrite(pin,u16 angle);
void servoAttch(pin);
void servoDetach(u8 pin);
…… 给大家来点直接的,把PID程序和库函数说明贴上 这个要顶起。 PID控制 代码。 哈哈~STC核心的ardunio嘛~ 我是觉得啊,别人arduion的优势在于编程语言简单,你这还是用C语言。
不如直接STM32,功能又强大资料又多库做的又好。 嗯嗯……一语中的 “我是觉得啊,别人arduion的优势在于编程语言简单,你这还是用C语言。
不如直接STM32,功能又强大资料又多库做的又好”
有了这些库C语言编程一样简单,难得是我编库麻烦,STC单片机已经是片上系统了,功能照样强大{:smile:} dswybs 发表于 2014-8-31 17:53
“我是觉得啊,别人arduion的优势在于编程语言简单,你这还是用C语言。
不如直接STM32,功能又强大资料又多 ...
是C语言本身的一些特性导致编程困难的,比如说强类型,指针什么的,而且只是LZ自己觉得编程简单了……
劝LZ去用用STM32的库再回来把自己的库重写了吧。 谢谢你的建议,以后会用STM32 楼主,你那按键叫什么名字 硅橡胶按键 顶楼主,厉害!最近要用到PID,下载学习下 dswybs 发表于 2014-8-31 18:56
硅橡胶按键
淘宝上搜索“硅橡胶按键”搜不到啊?
你这个按键是自己买的吗? 该怎么跟店家说这种按键啊?谢谢啦。 请把我的照片发给对方就行了 stc 数字电源+自动下载,mark 这电源的负载响应怎么样? 谢谢分享。。。 mark, thanks 很好的资料 正好在弄PID
谢谢啦 好东西,学习了 好好研究下。 悟空间 支持。。。 支持!借鉴来用下。谢LZ 碉堡了=-= PID部分可以参考参考 库不错 手机先标记下 必须顶一下。。。其实我是来看PID的 先收藏,谢谢了 q15格式化比较感兴趣啊,这个对计算精度影响有多大 下载下来研究研究,谢谢分享 看着很牛b,顶一下。 收藏了,学习一下 收藏了,学习一下 对STCunio无爱,想看PID。 mark~~~~~~~~~~~~~~~~~ 不错,没有说线性度好不好。 1。楼主可以KEIL外再包一层软件。就像ARDUINO的软件包了一下GCC一样。降低硬件改变造成的程序修改
2。ARDUINO后台有一个计时器中断一直在跑。s, ms us, 都可以随时调用函数获取。使用方便。时间还算比较精确。
结合1。2。 这样程序在移植到不同版本的ARDUINO下同样可用。非常可靠顺。
谢谢分享 学习学习 支持!收藏。 谢谢分享 PID竟然搞个库文件。没见到源文件呀。 呵呵,楼主本来就说是库了 文章小生 发表于 2014-12-25 17:54
PID竟然搞个库文件。没见到源文件呀。
源文件在此
http://www.amobbs.com/thread-5609262-1-1.html
(出处: amoBBS 阿莫电子论坛)
收藏了哈 看着还不错,改天搞个玩玩{:lol:} 作为伸手党,非常关心带负载的动态响应如何 不错,支持下!!!{:loveliness:} 不错,学习学习。 able 发表于 2015-1-22 09:02
不错,学习学习。
请到这个帖子下载源代码
http://www.amobbs.com/thread-5609262-1-1.html
(出处: amoBBS 阿莫电子论坛)
学习学习!不错嘛!! dswybs 发表于 2014-8-31 17:24
给大家来点直接的,把PID程序和库函数说明贴上
PID 研究研究 谢了 学习了,收下先。 支持啊
楼主买的按键好别致 楼主,好厉害
学习一下。。。。 学习,谢谢!!! 关心这数字电源的负载动态响应
页:
[1]