21275除以多少等于整数?

现在开始分析C语言的代码(代码建议复制到notepad++中查看),为方便读者试验,每个代码都是独立的子模块,复制到工程中就可以编译运行:

一、配置高级定时器TIM1产生6路互补PWM,带刹车保护

注:ST的FOC库,采用的Iβ轴(即虚轴)滞后Iα90度的表示方法。与其他地方说的Iβ提前Iα90度是一样的效果。只是表示方法不同而已,选择了这种表示方法,后面的park变换也和提前90度的不同。

3、Trig_Functions函数,使用查表的方法计算目标角度的三角函数。速度快,精度也还可以,读者可以自己测试一下精度。

4、使用park变换将电流 Iα、Iβ 和转子的电角度θ转化为电流 Iq、Id。

5、反park变换就是上面park变换的逆过程,公式就不推了。

使用了宏定义,选择是否使用PID的D调节。一般PI控制就已经足够。

看下面的FOC的处理过程:

        可以发现在PID计算后,要进行CircleLimitation处理,为什么呢?因为我们需要控制旋转磁场大小的恒定,如果d、q轴给得太大了,那么输出的旋转磁场就会过调制,圆形磁场就会凸起来一块。PID控制器只能对单独的d、q轴大小进行限制,可是它控制不了d、q轴合成矢量的大小。比如:最大值要求限制在1,d=/qlexcel/article/details/

SVPWM的原理讲解在这儿:

现在开始分析C语言的代码(代码建议复制到notepad++中查看),为方便读者试验,每个代码都是独立的子模块,复制到工程中就可以编译运行:

一、配置高级定时器TIM1产生6路互补PWM,带刹车保护

详细配置代码如下,把下面的程序段拷贝到main.c中直接就可以输出PWM波形(要保证BKIN下拉),方便读者验证:

//因为电流环的采样是靠TIM1来触发的 //设置刹车特性,死区时间,锁电平,OSSI,OSSR状态和AOE(自动输出使能)

BKIN作为报警信号或者刹车信号的输入,当检测此信号时,TIM1的PWM会硬件上停止输出,实时性好,起到保护硬件电路的作用。

2、观察SVPWM的PWM波形是对称的:

正好配置TIM1为中央对齐模式1,在上面代码的配置中,载波周期为15KHz,TIM_Period(ARR)=2400,CH1的TIM_Pulse(CCR)=800。采用的PWM1模式,即CNT小于CCR时,输出有效电平,大于CCR小于ARR时,输出无效电平,又配置CHx的有效电平为高电平,CHxN的有效电平为高电平,则可以得到下面的PWM波形:

如果CHxN的有效电平是低电平,则输出的CHx和CHxN的波形是相同的。(可能CHx和CHxN有效电平的叫法相反)

3、配置CHx和CHxN空闲时的电平,调用TIM_CtrlPWMOutputs(TIM1, DISABLE)后,就进入空闲状态了,高侧没什么用,让空闲时低侧的管子导通,可以使相线连在一起,起到锁定的作用。

当然也可以使用TIM1的CH4来触发相电流采样,参数为TIM_TRGOSource_OC4Ref  ,再打开CH4,并配置CH4的比较值,比如配置比较值为PWM_PERIOD-5。这样当CNT计数到PWM_PERIOD-5时就会触发相电流的ADC采样,这种方法比较灵活,可以合理设置CH4的比较值,来让相电流采样点避开开关噪声。

二、配置双ADC模式和规则组、注入组,其中注入组由TIM1的TRGO触发

//读取散热器温度(过热保护) //读取总线电压值(过压、欠压保护) //读取电位器值,可以用来调速等 //读取母线电流值(过流保护) //读取刹车电阻电流(刹车电阻过流保护) //设置DMA1,用于自动存储ADC1和ADC2规则通道的转换值 /****使用双ADC模式,ADC1为主,ADC2为从。当ADC转换配置成由外部事件触发时,用户必须设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。 /**** 获取A、B相零电流值,下面是临时配置 ****/ //求Q1.15格式的零电流值,16个(零电流值/8)的累加,把最高符号位溢出。 /**** 获取A、B相零电流值的临时配置使用结束,下面恢复ADC1的正常配置 ****/ //获取散热器温度和母线电压值,做出相应的处理 //获取两相电流值,进行FOC运算

1、stm32的ADC转换速度为1MHz,精度为12位。采样时间可设置(1.5到239.5个周期),最小采样时间107ns。使用双ADC模式,同时触发ADC1、ADC2采集电机的两相电流,可保证采集到的两相电流值时间误差最小。配置ADC1为主,ADC2为从,用ADC1触发ADC2。

2、在众多的ADC采样通道中,A相、B相、母线电压值、散热器温度是对实时性要求比较高的,于是把他们配置成注入组通道,其余的配置成规则组。(注入组与规则组的关系和main中的while循环与中断类似,当注入组被触发时会打断规则组的ADC转换,优先转换注入组的通道,当注入组转换完成,规则组才继续转换)

3、在双ADC模式下,DR寄存器的高16位存储了ADC2的转换数据,低16位存储了ADC1的转换数据:

4、左右对齐的问题,ADC的转换精度只有12位,要保存的数据宽度为16位,因此存在靠左还是靠右的问题。

如上,注入组合规则组的左右对齐并不一样。推荐使用右对齐,直接取低12位即可。(上面的例程使用的左对齐,要做修改)

5、为了获取A、B相零电流时的值用于后面电机运行电流的矫正,先把注入组设置为软件触发,把零电流值采集完成后,再把配置修改成用TIM1的TRGO信号触发。因为是双ADC模式,只需要配置ADC1的触发信号就可以了。

6、求Q1.15格式的零电流值,16个(零电流值/8)的累加,把最高符号位溢出:

我们都知道MCU处理定点数会很快,处理浮点数比较慢,但是相电流采样值一般都比较小,会有小数,因此我们要使用Q格式来让浮点数据转化为定点数,提高处理速度。

        因此我们上面使用的Q1.15格式(也称Q15),就是用15位来表示小数部分,最高位是符号位。浮点数转化为Q15,要将数据乘以2的15次方。Q15数据转化为浮点数,将数据除以2的15次方。

TIM2->CNT = COUNTER_RESET; //设定电机转子初始电角度,一般电机校零后,掉电时要把电角度保存下来,再次上电时直接使用,就不用再校零了 //TIM2->CNT向上溢出或向下溢出,都会触发此中断,即3999加一到0,或0减一到3999

1、定时器的编码器模式只用CH1、CH2,因此把编码器的A、B信号接在TIM2_CH1、TIM2_CH2即可。

2、编码器的模式选择TIM_EncoderMode_TI12,即TI1和TI2都要计数,用两张图就能说明白编码器模式的原理了:

        TI1和TI2对应了编码器的A、B信号,第一列是指编码器的3种模式,即只计数TI1、只计数TI2和都要计数。第二列是相对信号的电平,比如我们讨论TI1的边沿,它的相对信号就是TI2。

        我们就可以来看了,首先看第二行,只计数TI1信号的模式。当它的相对信号(即TI2)是高电平时,如果TI1来一个上升沿,那么CNT就要向下计数(Down),如果来一个下降沿,那么CNT就要向上计数(Up)。示意图如下:

在时刻1,当TI2为低电平时,TI1来一个上升沿,CNT向上计数1.

在时刻3,当TI2为高电平时,TI1来一个下降沿,CNT又向上计数1.

        同样的道理你也可以理解只计数TI2信号的模式,然后把这两个模式加起来你也可以理解同时计数TI1和TI2的模式。

1)、首先是S16_MAX对应180度、S16_MIN对应-180的问题。这里其实就是利用了u32和s32数据类型表示的范围不同,而巧妙的产生了负数。我们知道u32的范围是:0到。而s32的范围是:-到。

(4*ENCODER_PPR))就是把分成4000份,如果CNT的值在0-2000,那么得到的结果最大也就是的一半,即,这时还没有超过s32的范围。当CNT=2001,得到,超过了s32范围,那么会怎么样呢?会从s32范围的最小值开始往上增加,就像一个环一样,最大值和最小值之间只差1。于是超出了:-=1072094,绕了一圈后得到:-+=-。

        有没有发现数据类型的这种特性和电机的电角度也是类似的?电机的电角度从0度增加到180度,然后再增加就变成-179度,又从-179度增加到0度,完成一圈。和数据类型的:从0增加到,再增加就变成-,又从-增加到0,完成一圈。

最后再把s32的数整除65536,就可以得到s16的数据类型了。(不能移位,会把符号位也移动了)

2)、极对数和电角度的关系

在函数还有一句:temp *= POLE_PAIR_NUM,即电角度要被极对数放大,这是为什么呢?

首先看极对数是什么:极对数是每相励磁绕组含有的磁极个数。

如果极对数是1,即每相只有一对磁极(一对磁极=2极,两对磁极=4极)

那么这3个相的磁极互差120度分布,相电流呈正弦规律变化一次,合成电压矢量旋转一圈,旋转磁场也会旋转一圈:

如果极对数是2,即每相有2对磁极:

那么这3个相的磁极互差60度分布,相电流呈正弦规律变化一次,合成电压矢量旋转半圈,旋转磁场也旋转半圈:

(此处差一个gif。。。有没有谁知道上面那种gif怎么画的。。。)

因此SVPWM输入的电角度和电机转子的机械角度之间就有极对数的倍数关系了:

如果极对数是1,那么SVPWM输出的磁场旋转一圈,电机转子也旋转一圈,电角度和电机转子角度是一一对应的。

如果极对数是2,那么SVPWM输出的磁场旋转一圈,电机转子只旋转半圈,电角度是电机转子角度的2倍。

编码器的角度反映的是电机转子的机械角度。

后话:既然1对极电机就能转了,干嘛还要2对、4对呢?虽然极对数越多,转速越慢,但是扭矩可以越大。参考:

四、FOC相关变换的代码实现

前面中的代码中我们用TIM1的TRGO信号触发ADC注入组的转换。然后ADC的注入组转换完成后会产生中断,然后在中断函数对相电流进行采样,再经过clark变换把Ia, Ib, Ic变换成Iα, Iβ,再经过park变换,把Iα, Iβ变换成Iq, Id。

获取相电流采样值、clark变换、park变换、反park变换的函数如下:

在注入组采样完成中断中调用,获取相电流的采样值。返回(电流采样值-零电流值),Q15格式

2、用ADC采集电机的两相电流,即可通过Ia+Ib+Ic=0得到第三相的电流。电机的三相电流是在时间上互差120度,成正弦规律变化的波形。电流波形如下:

我们通过clark变换,把Ia、Ib、Ic变换为Iα、Iβ:

变换公式:(可以当成矢量分解来理解)

公式中有一个系数k,一般取2/3。有兴趣可以去这儿了解:。带入2/3:

注:ST的FOC库,采用的Iβ轴(即虚轴)滞后Iα90度的表示方法。与其他地方说的Iβ提前Iα90度是一样的效果。只是表示方法不同而已,选择了这种表示方法,后面的park变换也和提前90度的不同。

3、Trig_Functions函数,使用查表的方法计算目标角度的三角函数。速度快,精度也还可以,读者可以自己测试一下精度。

4、使用park变换将电流 Iα、Iβ 和转子的电角度θ转化为电流 Iq、Id。

5、反park变换就是上面park变换的逆过程,公式就不推了。

//把P调节和I调节结果除以分数因子再相加,得到PI控制的结果

PID控制没什么好说的,网上资料很多。此处用的PID也很普通,很容易看懂。

使用了宏定义,选择是否使用PID的D调节。一般PI控制就已经足够。

看下面的FOC的处理过程:

可以发现在PID计算后,要进行CircleLimitation处理,为什么呢?因为我们需要控制旋转磁场大小的恒定,如果d、q轴给得太大了,那么输出的旋转磁场就会过调制,圆形磁场就会凸起来一块。PID控制器只能对单独的d、q轴大小进行限制,可是它控制不了d、q轴合成矢量的大小。比如:最大值要求限制在1,d=0.8,q=0.9,他们各自的大小都没有超过1,可是它们的合成矢量大小却超过了1。示意图如下,就是要用比例关系,把外圆上的d、q值等比例缩小到内圆上:

/**** 根据载波频率来选择调制系数,频率越大,调制系数越小(实质是控制的最大占空比) ****/
/**** 以下是根据选择的调制系数,计算d、q轴合成矢量模的最大值。用宏定义,优化计算速度 ****/
把经过PID调整过的d、q值的合成矢量模值限制在最大值,如果超过了,那么等比例缩小d、q值
 
上面的过程也没有什么好说的,具体可以看注释。为了优化处理速度,能用查表的地方都用查表了。





根据FOC的处理过程,相电流采样后经过clark变换、park变换得到d、q轴值,然后和参考值做PID运算,再经过归一化,反park变换得到 Vα、Vβ,这就是FOC的处理结果,然后输出给SVPWM去执行,下面我们来看看SVPWM处理函数:

//下面是查找定子电流的扇区号
1、上面的处理的处理函数,先用输入的Vα、Vβ计算wUAlpha、wUBeta,再根据wUAlpha、wUBeta计算wX、wY、wZ,再由wX、wY、wZ判断扇区号和占空比,计算过程完全同手册说的一样:


























2、扇区判断和占空比计算的原理与说的一样,这里就不细说了。代码中有疑虑就是那个T/8和131072是什么意思。


因为T等于4倍的ARR值,所以T/8就等于ARR/2,相当于把3个通道的比较值平移了半个周期。因为当3个通道的波形相同时,实际上并没有输出(只有3个低侧开关管或高侧开关管打开),真正有输出的是3个通道波形不一样的地方(有高侧管子打开也有低侧管子打开),所以让3个通道同时移动相同ARR/2对输出并没有什么影响,同时方便了计算,避免了出现通道比较值为负的情况。








因为用的st的库,svpwm的实现函数也没怎么去研究过。感觉这个函数有点绕,让人晕,其实知道了原理后,读者可以自己实现。


8、FOC总的处理函数:





把这个函数放在ADC注入组转换完成中断中调用即可。


现在我们梳理一下整个过程:配置TIM1、ADC,并设置ADC的注入组转换由TIM1触发。这样在每个载波周期,都会触发一次ADC注入组采样,相电流采样完成后调用FOC_Model进行FOC运算处理,然后把最后的计算结果更新到TIM1的输出。现在还有一个问题:现在自己手中有上面的代码、相关的硬件和一个电机,怎么让电机开始转起来呢?那就要看了。








PS:工程要的人多,我放在这儿了,卖3块,平台收30%,得2.1,当赏瓶可乐吧。


工程中的代码在本文中已经基本给出来了,为了方便大家直接看,才给出工程的,少去了你自己去整理代码。至于为什么卖3块,我已经说了是“赏”,你觉得看了文章有帮助,“赏”给我的。


那些因为我卖钱,就骂我的白嫖党也是牛逼,你觉得我花时间写这些东西给你们看,是天经地义的?爱看看,不看滚。

卡巴拉数字 The Kabala of Numbers ——By Sepharial (1920) 目 录 简介3 数字的力量4 思维的几何关系9 数字学12 卡巴拉体系的各种方法18 数字,外形,颜色,声音23 名字,数字和事件26 偶然事件32 还原成法则36 数字和下意识42 用数字解读思想45 数字的意义48 丢失的东西51 卡巴拉循环体系54 成功和失败57 价值法则59 布鲁诺的象征体系65 宇宙相似性69 一些深奥的难题73 上帝几何学76 卡巴拉数字 简介 数字的科学是最遥远的学科。在印欧语系人种,希腊人,亚述人和埃及人中,我们发现了对数字的真正意义给予了发展的迹象,使数字纳入到一种崇拜某物的象征体系,而不仅仅是计数。 这是真的,一个数字象征着一定的数目,同时还有一个事实,一定的数目不仅仅表示一个纯粹的数字,从化学分析中我们知道,两个由相同元素的相同数量的原子组成的物体,具有完全不同的化学性质。这就如同phenylisocyanide和benzonitrile的情况。只是原子的排列不同而已,单个氮原子在一个分子里积极,在另一个里消极。位置在起作用,然而,通常的论点认为,所有的物体是从单个基础中吸取的元素的复合物,它们的特殊差异归因于它们中一个对另一个的支配。占星家断言,对相似分析有独特的性格,所有人由相同的宇宙力量构成,一个人比另一个在体内有更多的土星天性,生来受那个行星的支配,然而,另一个有更多的火星天性,由于在他出生时火星的支配或上升,因此他们有明显的性格差异。一个沉闷,忧郁,不爱说话,另一个精力充沛,有进取心,感情外露。总而言之,如同其他任何一个人,每个人是宇宙元素的变型,宇宙力量的合成。但还有一些事。彩色玻璃后面总是有光。照亮个人综合组织的智慧显示为性格。 相似地,宇宙背后存在着一种智慧,通过宇宙元素向我们显现为天性。上帝几何学,实际上,我们拥有对神圣智慧的几何表达。结晶作用依据明确的法则而发生。所有的高级金属元素以正多边形的角或补角结晶,可以内切于一个圆;这些角正是在星体科学中起作用的。水,古人以一种神秘感指代万物之母,它们的物质基础,以60°角结晶。宇宙只是上帝的思维结晶;它是一种神圣的思想形式。通过研究数字,我们可以了解神圣表达的法则,从宇宙的构成到它的进化进程中最平凡的事件。我们所称为事件的,只不过是现实中部分天体的替代和重新整理。发生在宇宙中的变化在它所有的构成部分都伴随着一些变化,这些变化可能聚集成大灾变。它们也可能产生阵雨,流行病或小麦价格每百磅一便士的上升。承认人和宇宙的关系,很难否认它们,从任何独立的宇宙安排中产生的相互关联的影响确实没有尽头,例如,太阳冲火星,这时我们的地球处于火星星力的直径中。 在研究数字时,我们不仅涉及数字学或象征体系,还有数量和几何关系。这项研究有它的原理,入门,语言和术语,以及重要性。在这些页数中,我将尽力展示数字的意义,由于缺少更好的术语,我必须称为神秘学;尽管,比较而言它将是一个容易的问题,以探索人和宇宙的关系,就数字和事件间的任何联系可以被探索的神秘性质将产生争论。但是,如果我展示这种联系存在,至少将有充足的证据来建立这样一个争论,或许,从中可以产生对开启宇宙神秘的古老钥匙的更好理解和充分欣赏,这被Swedenborg男爵在《一致教义》(《Doctrine Correspondences》)中重新发现和部分阐述。在这个教义中,物质是精神的终极表达,如同形态对于力量。因此,对于每一个精神力量,有一个相对应的物质形态。整个自然因此成为潜在精神世界的表达,它的外貌成为我们精神世界最主要的来源。这些法则主宰着这个表达,只能根据数字来探索,即几何比率。道德感只是自然法则中正直和融洽的下意识的识别,对更大环境的反射。物质和精神法则之间有类似。它们可能产生于一个共有的起因。数字的科学就是两者的钥匙。 数字的力量 数字是我们用于表达确切数量的方法。它们不表示事物质量的好坏。因此,如果我们说2个鸡蛋加2个鸡蛋得到4个鸡蛋,我们没有考虑它们中一个或者更多可能是坏的。从这我们知道,2或任何其他数字,可能或好或坏,它的数量并不受影响。 每个数字,除了使用符号表示数量外,还有某种力量。这种力量依赖于存在于事物的关系和所呈现出来的自然原理之间的一种神秘联系。 当人们发展出数字序列0 1 2 3 4 5 6 7 8 9时,启示最初使用了很明显的形式,无论它用什么符号表达。 在这一系列中,0代表无穷,无限的存在,万物的源头,宇宙的婆罗门或卵,整个的太阳系;因此代表着普遍性,世界大同主义,绕行,远航。但也代表对立面,圆周,限制和贫乏。因此这是一个普遍性的悖论,无穷大和

我要回帖

更多关于 0可以除以任何数吗 的文章

 

随机推荐