当前位置: 首页 > news >正文

PID

<!-- wp:paragraph -->
<p><font style="background:#F6E1AC;color:#664900">施工中</font></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"background":"#ff000045"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background-color:#ff000045"><!-- wp:paragraph -->
<p> 本文依据江协科大的视频和PPT所写,图片也都来自视频截图或PPT。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>本文项目框架大体上沿用正点原子,并根据个人习惯做出适当修改。如串口驱动分开在usart.c和stm32f1xx_it.c里;并且printf函数抽象成<font style="color:#5C8D07;">int my_USART_printf(uint8_t x, char *format, ... ) </font>,可以指定串口发送数据。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>本文使用视频配套套件。若你只是想要了解 PID 控制原理及流程,可以不使用套件,否则建议搭配套件食用。</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"background":"#ffd90052"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background-color:#ffd90052"><!-- wp:paragraph -->
<p>⚠️建议在语雀中阅读:<a href="https://www.yuque.com/wenzhimo/qianrushi/pid?singleDoc# 《PID控制算法》">https://www.yuque.com/wenzhimo/qianrushi/pid?singleDoc# 《PID控制算法》</a></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>视频地址:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.bilibili.com/video/BV1G9zdYQEr3">PID入门教程-电机控制 倒立摆 全程手把手打代码调试_哔哩哔哩_bilibili</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="FqyGf">PID理论基础</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="ZMinz">PID是什么</h2>
<!-- /wp:heading -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(317deg,rgba(132,208,255,0.71) 4%,rgba(133,81,224,0.49) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(317deg,rgba(132,208,255,0.71) 4%,rgba(133,81,224,0.49) 100%)"><!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>PID是比例(Proportional)、积分(Integral)、微分(Differential)的缩写。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>PID是一种闭环控制算法,它动态改变施加到被控对象的输出值(Out),使得被控对象某一物理量的实际值(Actual),能够快速、准确、稳定地跟踪到指定的目标值(Target)。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>PID是一种基于误差(Error)调控的算法,其中规定:误差=目标值-实际值,<font style="color:#C99103;">PID的任务是使误差始终为0。</font></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>PID对被控对象模型要求低,无需建模,即使被控对象内部运作规律不明确,PID也能进行调控。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>简单来说,PID是通过对误差的运算来控制较为简单的系统或无法明确知晓内部工作原理的系统的算法。</p>
<!-- /wp:paragraph -->

<!-- wp:more -->
<!--more-->
<!-- /wp:more -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="ud70403ba"><span class="ne-text">查看:开环与闭环</span></summary>
<p id="u9c999114" class="ne-p"><span class="ne-text">开环</span><span class="ne-text" style="color:white">(Open Loop)</span><span class="ne-text">是指</span><span class="ne-text" style="color: white">控制器单向输出值给被控对象,不获取被控对象的反馈,控制器对被控对象的执行状态不清楚;</span></p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID1.webp" width="612.4183121055088" id="udd9733d3" class="ne-image"></figure><p id="u132bc297" class="ne-p"></p>
<p id="uc740aba3" class="ne-p"><span class="ne-text" style="color: white">闭环(Closed Loop)是指控制器输出值给被控对象,同时获取被控对象的反馈,控制器知道被控对象的执行状态,可以根据反馈修改输出值以优化控制。</span></p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID2.webp" width="685.6209278534458" id="ua9e898aa" class="ne-image"></figure><p id="u1373c5f7" class="ne-p"></p>
<div data-type="color3" class="ne-alert">
<p id="ua1f472db" class="ne-p"><span class="ne-text">换言之,开环控制只能控制对象的一个"趋向",而闭环可以精确控制对象的物理值。</span></p>
</div>
</details>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="KgmoK">PID是怎样工作的</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="OLZhp">PID公式与系统框图</h3>
<!-- /wp:heading -->

<!-- wp:shortcode -->
[mathjax]
<!-- /wp:shortcode -->

<!-- wp:paragraph -->
<p>$$误差:𝑒𝑟𝑟𝑜𝑟(𝑡)=𝑡𝑎𝑟𝑔𝑒𝑡(𝑡)−𝑎𝑐𝑡𝑢𝑎𝑙(𝑡)$$ </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ PID输出值: 𝑜𝑢𝑡(𝑡)=𝐾_𝑝 (𝑒𝑟𝑟𝑜𝑟(𝑡)+frac{1}{𝑇_𝑖} ∫_0^𝑡𝑒𝑟𝑟𝑜𝑟(𝑡)𝑑𝑡+frac{𝑇_𝑑 𝑑𝑒𝑟𝑟𝑜𝑟(𝑡)}{𝑑𝑡}) $$</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ PID输出值: 𝑜𝑢𝑡(𝑡)=𝐾_𝑝∗𝑒𝑟𝑟𝑜𝑟(𝑡)+𝐾_𝑖∗∫_0^𝑡𝑒𝑟𝑟𝑜𝑟(𝑡)𝑑𝑡+𝐾_𝑑∗frac{𝑑𝑒𝑟𝑟𝑜𝑟(𝑡)}{𝑑𝑡} $$</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1012,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID3-1024x363.webp" alt="" class="wp-image-1012"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain"} -->
<blockquote class="wp-block-quote is-style-plain"><!-- wp:paragraph -->
<p>其中,第二条公式使用较少且调参麻烦,一般使用第三条公式。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第三条公式是由第二条把Kp乘进去得到的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>公式为“经验公式”,不用细究其中深意(</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(0,246,255,0.32) 1%,rgb(89,81,224) 96%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(0,246,255,0.32) 1%,rgb(89,81,224) 96%)"><!-- wp:paragraph -->
<p>简单拆解公式可以得到:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>OUT = Kp<em>当前值 + Ki</em>历史值 + Kd*变化趋势</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="fGpth">详解PID公式</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading" id="JADo3">P:比例项</h4>
<!-- /wp:heading -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>只含有比例项的输出:$$ 𝑜𝑢𝑡(𝑡)=𝐾_𝑝∗𝑒𝑟𝑟𝑜𝑟(𝑡)$$。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>比例项的输出值仅取决于当前时刻的误差,与历史时刻无关。当前存在误差时,比例项输出一个与误差呈正比的值,当前不存在误差时,比例项输出0。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>K_p越大,比例项权重越大,系统响应越快,但超调也会随之增加。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>纯比例项控制时,系统一般会存在稳态误差,Kp越大,稳态误差越小。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(305deg,rgba(7,146,227,0.43) 1%,rgba(155,81,224,0.35) 96%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(305deg,rgba(7,146,227,0.43) 1%,rgba(155,81,224,0.35) 96%)"><!-- wp:paragraph -->
<p><br> 超调:指明明只有一点误差,PID却反馈一个很大的输出,导致系统越过目标值朝另一个方向靠拢;即用力过猛</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>稳态误差:指系统达到稳定状态后仍和目标值有一定误差。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>•<font style="color:#FBDE28;">稳态误差产生原因</font>:纯比例项控制时,若误差为0,则比例项结果也为0。被控对象输入0时,一般会自发地向一个方向偏移,产生误差。产生误差后,误差非0,比例项负反馈调控输出,当调控输出力度和自发偏移力度相同时,系统达到稳态。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>•<font style="color:#FBDE28;">判断是否会产生稳态误差</font>:给被控对象输入0,判断被控对象会不会自发偏移。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>•<font style="color:#FBDE28;">判断稳态误差的方向</font>:给被控对象输入0,自发偏移方向即为稳态误差方向。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>举例:当PID输出只有比例项,且目标值为10,Kp=0.25时,当系统达到3时, out=7*0.25=1.75,与系统自偏差相同,两者相互抵消。这就造成系统仍和目标有差距却达到稳态的情况。这里的系统自偏差可能是由于电机有摩擦力。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:gallery {"linkTo":"none","layout":{"type":"flex","flexWrap":null}} -->
<figure class="wp-block-gallery has-nested-images columns-default is-cropped"><!-- wp:image {"id":1013,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID4.webp" alt="" class="wp-image-1013"/><figcaption class="wp-element-caption"><mark style="background-color:#000000" class="has-inline-color has-base-color">Kp=0.25</mark></figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1014,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID5.webp" alt="" class="wp-image-1014"/><figcaption class="wp-element-caption"><mark style="background-color:#000000" class="has-inline-color has-base-color">Kp=0.75</mark></figcaption></figure>
<!-- /wp:image --></figure>
<!-- /wp:gallery -->

<!-- wp:group {"layout":{"type":"grid","columnCount":2,"minimumColumnWidth":null}} -->
<div class="wp-block-group"><!-- wp:image {"id":1015,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID6.webp" alt="" class="wp-image-1015"/><figcaption class="wp-element-caption">Kp=0.5</figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1016,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID7.webp" alt="" class="wp-image-1016"/><figcaption class="wp-element-caption">Kp=1</figcaption></figure>
<!-- /wp:image --></div>
<!-- /wp:group -->

<!-- wp:paragraph -->
<p>从上图可以看到,Kp越大,稳态误差越小,但始终存在。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading" id="Hv4c4">I:积分项</h4>
<!-- /wp:heading -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>含有比例项和积分项的输出:$$ 𝑜𝑢𝑡(𝑡)=𝐾_𝑝∗𝑒𝑟𝑟𝑜𝑟(𝑡) + 𝐾_𝑖∗∫_0^𝑡𝑒𝑟𝑟𝑜𝑟(𝑡)𝑑𝑡$$</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>积分项的输出值取决于0~t所有时刻误差的积分,与历史时刻有关。积分项将历史所有时刻的误差累积,乘上积分项系数Ki后作为积分项输出值。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li><font style="color:#C99103;">积分项用于弥补纯比例项产生的稳态误差,若系统持续产生误差,则积分项会不断累积误差,直到控制器产生动作,让稳态误差消失。</font></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Ki越大,积分项权重越大,稳态误差消失越快,但系统滞后性也会随之增加。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><br> 在程序中,积分即为每次测得的error值累加到一个总error值里;0~t表示从程序刚开始运行的时候就开始进行累加。</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(313deg,rgba(7,146,227,0.48) 1%,rgba(155,81,224,0.47) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(313deg,rgba(7,146,227,0.48) 1%,rgba(155,81,224,0.47) 100%)"><!-- wp:paragraph -->
<p>由于积分项进行的是累加操作,所以当误差为0时积分项不会清零,而是维持在一个值左右,可以和系统自偏差相抵消。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>基于同样的原因,从误差产生到积分发挥作用需要一定的时间,当输出只有积分时,系统的滞后性会大大增加,这点在电机正转反转之间切换时尤为明显。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:group {"layout":{"type":"grid","columnCount":3,"minimumColumnWidth":null}} -->
<div class="wp-block-group"><!-- wp:image {"id":1017,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID8.webp" alt="" class="wp-image-1017"/><figcaption class="wp-element-caption">Kp=0,Ki=0.05</figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1018,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID9.webp" alt="" class="wp-image-1018"/><figcaption class="wp-element-caption">Kp=0.25,Ki=0.2</figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1019,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID10.webp" alt="" class="wp-image-1019"/><figcaption class="wp-element-caption">Kp=0.25,Ki=0.5</figcaption></figure>
<!-- /wp:image --></div>
<!-- /wp:group -->

<!-- wp:group {"layout":{"type":"grid","columnCount":3,"minimumColumnWidth":null}} -->
<div class="wp-block-group"><!-- wp:image {"id":1020,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID12.webp" alt="" class="wp-image-1020"/><figcaption class="wp-element-caption">Kp=0.25,Ki=0.05</figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1021,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID13.webp" alt="" class="wp-image-1021"/><figcaption class="wp-element-caption">Kp=0.5,Ki=0.2</figcaption></figure>
<!-- /wp:image -->

<!-- wp:image {"id":1022,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID14.webp" alt="" class="wp-image-1022"/><figcaption class="wp-element-caption">Kp=0.5,Ki=0.5</figcaption></figure>
<!-- /wp:image --></div>
<!-- /wp:group -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading" id="jsMD2">D:微分项</h4>
<!-- /wp:heading -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>含有比例项、积分项和微分项的PID输出:$$ 𝑜𝑢𝑡(𝑡)=𝐾_𝑝∗𝑒𝑟𝑟𝑜𝑟(𝑡)+𝐾_𝑖∗∫_0^𝑡𝑒𝑟𝑟𝑜𝑟(𝑡)𝑑𝑡+𝐾_𝑑∗frac{𝑑𝑒𝑟𝑟𝑜𝑟(𝑡)}{𝑑𝑡} $$</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>微分项的输出值取决于当前时刻误差变化的斜率,与当前时刻附近误差变化的趋势有关。当误差急剧变化时,<font style="color:#C99103;">微分项会负反馈输出相反的作用力,阻碍误差急剧变化。</font></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>斜率一定程度上反映了误差未来的变化趋势,这使得微分项具有 “预测未来,提前调控”的特性。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>微分项给系统增加阻尼,可以有效防止系统超调,尤其是惯性比较大的系统。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Kd越大,微分项权重越大,系统阻尼越大,但系统卡顿现象也会随之增加。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(312deg,rgba(7,146,227,0.38) 0%,rgba(155,81,224,0.51) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(312deg,rgba(7,146,227,0.38) 0%,rgba(155,81,224,0.51) 100%)"><!-- wp:paragraph -->
<p><br> 在程序中,微分就是指上一次和这一次误差的差值,如果你的程序是每隔一段时间测量一下,也可以除以取均值,或是减小Kd相应的值。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>微分项一般配合PI或P使用。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>微分项可以有效防止系统震荡,使震荡不断衰减;同时微分项的阻尼作用对PI也有效,会削弱PI项的调控力度。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1023,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID15.webp" alt="" class="wp-image-1023"/><figcaption class="wp-element-caption">Kd值不同的变化。从左到右四段Kd值分别是0、0、2、4</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain"} -->
<blockquote class="wp-block-quote is-style-plain"><!-- wp:paragraph -->
<p>图片解释:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第一段:系统稳定,没有误差。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第二段:误差开始出现,并且导致系统震荡,越来越大。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第三段:Kd为2,开始削减震荡;但震荡减小到一定程度后削减作用不明显。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第四段:Kd为4,削减力度加强,波形趋于平稳。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="lQOjC">单片机中的PID</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading" id="t3qi0">离散形式PID</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在上文中,我们了解的error(t)是一个连续的函数,但在单片机中两次测量往往会间隔一定的时间;也就是说,我们实际上得到的是一个个离散值。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在离散形式的PID中: $$𝑜𝑢𝑡(𝑡)=𝐾<em>𝑝∗𝑒𝑟𝑟𝑜𝑟(k)+𝐾𝑖∗ \textstyle sum{j=0}^k 𝑒𝑟𝑟𝑜𝑟(j)+𝐾</em>𝑑∗(error(k)-error(k-1))$$</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain"} -->
<blockquote class="wp-block-quote is-style-plain"><!-- wp:paragraph -->
<p>实际上应该是$$ 𝑜𝑢𝑡(𝑡)=𝐾_𝑝∗𝑒𝑟𝑟𝑜𝑟(k)+𝐾<em>𝑖∗T* \textstyle sum</em>{j=0}^k 𝑒𝑟𝑟𝑜𝑟(j)+𝐾_𝑑∗frac{error(k)-error(k-1)}{T} $$ </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>但可以把T看作是参数的一部分,化简成上面的形式。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(151deg,rgb(85,85,85) 2%,rgb(31,31,31) 98%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(151deg,rgb(85,85,85) 2%,rgb(31,31,31) 98%)"><!-- wp:paragraph -->
<p><font style="color:#8CCF17;">上面的公式也可以叫“位置式PID”,与之相对的还有“增量式PID”:</font></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$\color{OrangeRed}{<br>\begin{align}<br>\Delta out(t) =<br>&amp;K_p * (error(k) - error(k-1))\\<br>&amp;+ K_ierror(k)\\ &amp;+K_d(error(k)-2error(k-1)+error(k-2))<br>\end{align}<br>}$$</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(180deg,rgba(7,146,227,0.53) 3%,rgba(155,81,224,0.49) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(180deg,rgba(7,146,227,0.53) 3%,rgba(155,81,224,0.49) 100%)"><!-- wp:paragraph -->
<p><br> 位置式和增量式更像是通项公式和递推公式的区别。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>增量式的好处是公式中没有求和这样的大型运算,所有运算都是加减乘除基础运算。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>增量式PID适合被控对象有积分功能或有积分性质,如步进电机和阀门控制等。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="pJY0X">离散PID实现</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="eJEZI">确定调控周期T</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>T取决于:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>被控对象变化的速度:如平衡车、飞行器等就需要较高的调控频率(5ms甚至1ms),电机就不宜过高的调控频率(一般20~100ms);像锅炉这类变化及其缓慢的设备,T会更长。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>硬件限制:如姿态传感器更新间隔是5ms,那么小于这个间隔的调控都是无效的。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading" id="nTFMc">实现方案</h4>
<!-- /wp:heading -->

<!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>delay延时:不推荐。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>定时器:推荐,但需注意涉及硬件的操作,尽量避免中断访问某硬件、主函数也访问这个硬件,可能会造成资源冲突。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>定时器置标志位:在定时器中断中置标志位,主函数判断标志位然后执行调控。这种方法避免了资源冲突,但和方法1有一样的问题。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="jYOjv">位置式PID实现</h3>
<!-- /wp:heading -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(253deg,rgba(7,146,227,0.52) 0%,rgba(155,81,224,0.53) 99%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(253deg,rgba(7,146,227,0.52) 0%,rgba(155,81,224,0.53) 99%)"><!-- wp:paragraph {"fontSize":"medium"} -->
<p class="has-medium-font-size">下面代码使用的是类似C的伪代码,采用方法2实现T。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/*定义变量*/\nfloat Target,Actual,Out; //目标值,实际值,输出值\nfloat Kp =值,Ki =值,Kd=值; //比例项,积分项,微分项的权重\nfloat Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分\n\nint main()\n{\n Timer_Init();\n\n while(1){\n Target = 用户在此处指定目标值;\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*定义变量*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target,Actual,Out;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标值,实际值,输出值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值,Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值,Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0, Error1, ErrorInt;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,误差积分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 用户在此处指定目标值;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":13,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/*定义变量*/
float Target,Actual,Out; //目标值,实际值,输出值
float Kp =值,Ki =值,Kd=值; //比例项,积分项,微分项的权重
float Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分

int main()
{
Timer_Init();

while(1){
Target = 用户在此处指定目标值;
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/*定义变量*/</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target,Actual,Out;</span><span style="color: #768390"> //目标值,实际值,输出值</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值,Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值,Kd</span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error0, Error1, ErrorInt;</span><span style="color: #768390"> //本次误差,上次误差,误差积分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 用户在此处指定目标值;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"void TIM2_IRQHandler(void)\n{\n if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)\n {\n /*每隔时间T,程序执行到这里一次*/\n /**********执行PID调控**********/\n\n /*获取实际值*/\n Actual=读取传感器();\n /*获取本次误差和上次误差*/\n\n Error1 = ErrorO;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n ErrorInt += ErrorO;\n\n /*PID计算*/\n Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n /*输岀限幅*/\n if(Out \u003e 上限){Out = 上限;}\n if(Out \u003c 下限){Out = 下限;}\n\n /*执行控制*/\n 输出至被控对象(Out);\n /********************/\n\n TIM_ClearITPendingBit(TIM2, TIM_IT_Update);\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM2_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_GetITStatus\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2, TIM_IT_Update) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*每隔时间T,程序执行到这里一次*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /**********执行PID调控**********/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*获取实际值*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual=读取传感器();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*获取本次误差和上次误差*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorO;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorO;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 上限){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 上限;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 下限){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 下限;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 输出至被控对象(Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /********************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_ClearITPendingBit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2, TIM_IT_Update);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":31,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
/*每隔时间T,程序执行到这里一次*/
/**********执行PID调控**********/

/*获取实际值*/
Actual=读取传感器();
/*获取本次误差和上次误差*/

Error1 = ErrorO;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += ErrorO;

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 上限){Out = 上限;}
if(Out &lt; 下限){Out = 下限;}

/*执行控制*/
输出至被控对象(Out);
/********************/

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM2_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">TIM_GetITStatus</span><span style="color: #ADBAC7">(TIM2, TIM_IT_Update) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #768390"> /*每隔时间T,程序执行到这里一次*/</span></span>
<span class="line"><span style="color: #768390"> /**********执行PID调控**********/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*获取实际值*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Actual=读取传感器();</span></span>
<span class="line"><span style="color: #768390"> /*获取本次误差和上次误差*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ErrorO;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> ErrorO;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> 上限){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 上限;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> 下限){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 下限;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> 输出至被控对象(Out);</span></span>
<span class="line"><span style="color: #768390"> /********************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_ClearITPendingBit</span><span style="color: #ADBAC7">(TIM2, TIM_IT_Update);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p><br> 值得注意的是<font style="color:#DF2A3F;">输出限幅</font>和<font style="color:#DF2A3F;">积分限幅</font>。比如电机控制函数参数接收范围为+-100,那么就需要对输出进行限幅防止参数不合法。如果不想误差积分影响过大,也可以设置积分限幅<font style="color:rgb(255, 109, 0);">(#即ErrorInt的上下限)</font>使得积分项可以兼具消除稳态偏差快和系统响应快的特点。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="wWdEy">增量式PID实现</h3>
<!-- /wp:heading -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/*定义变量*/\nfloat Target,Actual,Out; //目标值,实际值,输出值\nfloat Kp =值,Ki =值,Kd=值; //比例项,积分项,微分项的权重\nfloat Error0, Error1, Error2; //本次误差,上次误差,上上次误差\n\nint main()\n{\n Timer_Init();\n\n while(1){\n Target = 用户在此处指定目标值;\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*定义变量*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target,Actual,Out;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标值,实际值,输出值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值,Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值,Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e值;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0, Error1, Error2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,上上次误差\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 用户在此处指定目标值;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":13,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/*定义变量*/
float Target,Actual,Out; //目标值,实际值,输出值
float Kp =值,Ki =值,Kd=值; //比例项,积分项,微分项的权重
float Error0, Error1, Error2; //本次误差,上次误差,上上次误差

int main()
{
Timer_Init();

while(1){
Target = 用户在此处指定目标值;
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/*定义变量*/</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target,Actual,Out;</span><span style="color: #768390"> //目标值,实际值,输出值</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值,Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值,Kd</span><span style="color: #F47067">=</span><span style="color: #ADBAC7">值;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error0, Error1, Error2;</span><span style="color: #768390"> //本次误差,上次误差,上上次误差</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 用户在此处指定目标值;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"void TIM2_IRQHandler(void)\n{\n if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)\n {\n /*每隔时间T,程序执行到这里一次*/\n /**********执行PID调控**********/\n\n /*获取实际值*/\n Actual=读取传感器();\n /*获取本次误差和上次误差*/\n Error2 = Error1;\n Error1 = Error0;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n //ErrorInt += Error0;\n\n /*PID计算*/\n Out += Kp * Error0 + Ki * Error0 + Kd * (Error0 - 2*Error1 + Error2);\n\n /*输岀限幅*/\n if(Out \u003e 上限){Out = 上限;}\n if(Out \u003c 下限){Out = 下限;}\n\n /*执行控制*/\n 输出至被控对象(Out);\n /********************/\n\n TIM_ClearITPendingBit(TIM2, TIM_IT_Update);\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM2_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_GetITStatus\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2, TIM_IT_Update) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*每隔时间T,程序执行到这里一次*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /**********执行PID调控**********/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*获取实际值*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual=读取传感器();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*获取本次误差和上次误差*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//ErrorInt += Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error2);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 上限){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 上限;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 下限){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 下限;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e 输出至被控对象(Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /********************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_ClearITPendingBit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2, TIM_IT_Update);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":31,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
/*每隔时间T,程序执行到这里一次*/
/**********执行PID调控**********/

/*获取实际值*/
Actual=读取传感器();
/*获取本次误差和上次误差*/
Error2 = Error1;
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
//ErrorInt += Error0;

/*PID计算*/
Out += Kp * Error0 + Ki * Error0 + Kd * (Error0 - 2*Error1 + Error2);

/*输岀限幅*/
if(Out > 上限){Out = 上限;}
if(Out &lt; 下限){Out = 下限;}

/*执行控制*/
输出至被控对象(Out);
/********************/

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM2_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">TIM_GetITStatus</span><span style="color: #ADBAC7">(TIM2, TIM_IT_Update) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #768390"> /*每隔时间T,程序执行到这里一次*/</span></span>
<span class="line"><span style="color: #768390"> /**********执行PID调控**********/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*获取实际值*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Actual=读取传感器();</span></span>
<span class="line"><span style="color: #768390"> /*获取本次误差和上次误差*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Error2 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error1;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//ErrorInt += Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #F47067">*</span><span style="color: #ADBAC7">Error1 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Error2);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> 上限){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 上限;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> 下限){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> 下限;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> 输出至被控对象(Out);</span></span>
<span class="line"><span style="color: #768390"> /********************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_ClearITPendingBit</span><span style="color: #ADBAC7">(TIM2, TIM_IT_Update);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p><br> 注意,这里的out值是对增量的累加,因此上面的代码可以看作“用增量式PID实现位置式PID”的算法。虽说如此,但该算法仍有位置式不具备的功能:当PID暂停控制时,out会维持不变,而不是变为0 。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这种特性导致它特别适合那种需要切换自动控制和手动控制的场景。(位置式也可以,但由于误差积分需要一定时间进行变化,从手动切换自动会导致系统刚开始时出现抖动)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果想要原本的增量式,把“out += Kp……”的“+=”改成“=”即可。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="Cdb6J">PID编程实战</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="I0d8r">那些与PID无关的知识:基础驱动代码&amp;编码电机原理</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1749973652317-db9da971-1f95-49da-a461-4472e5c0528e.docx">00SimpleDriver.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在开始编写PID之前,得先完成底层外设驱动的编写,如此才能读取传感器的值、控制被控对象。<br> <mark style="background-color:#bb0000;color:#f9f9f9" class="has-inline-color">本文使用江协科技设计的PID学习套件,如果没有可以购买或根据官网原理图自行设计。</mark></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/pdf/40561973/1749895894344-e4b9a32a-b7f5-4379-8ef6-247544cb25c2.pdf">PID电机驱动及控制板-V1.0.pdf</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/pdf/40561973/1749895895643-b7f1710f-d12a-4eef-911d-74eb8bbe9499.pdf">PID入门套件用户手册-V1.0.pdf</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/pdf/40561973/1749895895702-8738233d-ee8a-40c9-9ab7-509bd4fe48e7.pdf">编码电机工作原理.pdf</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="aYzl8">外设表格一览</h3>
<!-- /wp:heading -->

<!-- wp:table {"style":{"color":{"gradient":"linear-gradient(348deg,rgba(7,146,227,0.2) 1%,rgba(155,81,224,0.16) 99%)"}}} -->
<figure class="wp-block-table"><table class="has-background has-fixed-layout" style="background:linear-gradient(348deg,rgba(7,146,227,0.2) 1%,rgba(155,81,224,0.16) 99%)"><thead><tr><th>外设名</th><th>引脚接线</th></tr></thead><tbody><tr><td>OLED显示屏</td><td>SCL PB8 <br>SDA PB9</td></tr><tr><td>电机驱动模块<font style="color:rgb(0,0,0);">TB6612FNG</font></td><td>AIN1 PB12<br>AIM2 PB13<br>BIN1 PB14<br>BIN2 PB15<br>PWMA PA0<br>PWMB PA1</td></tr><tr><td><font style="color:rgb(0,0,0);">稳压模块MP1584EN</font></td><td>无</td></tr><tr><td>编码电机接口(两组)</td><td>组一:<br>EA PA6<br>EB PA7<br>组二:<br>EA PB6<br>EB PB7</td></tr><tr><td>角度传感器接口(2个)</td><td>OUT1 PB0<br>OUT2 PB1</td></tr><tr><td>串口</td><td>RX PA10<br>TX PA9</td></tr><tr><td>电位器(4个)</td><td>PA2~PA5</td></tr><tr><td>按键(4个)</td><td>K1 PB10<br>K2 PB11<br>K3 PA11<br>K4 PA12</td></tr></tbody></table></figure>
<!-- /wp:table -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="Qy8b7">定时器(TIM1)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>定时器1用于按键检测、编码器读取速度等需要定时完成的工作。设置成1ms中断一次。</p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"TIM_HandleTypeDef g_tim1_handle; /* 定时器1句柄 */\n\nvoid Timer_Init(){\n LED_OFF();\n __HAL_RCC_TIM1_CLK_ENABLE(); /* 使能TIMx时钟 */\n\n g_tim1_handle.Instance = TIM1; /* 通用定时器x */\n g_tim1_handle.Init.Prescaler = 72-1; /* 预分频系数 */\n g_tim1_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */\n g_tim1_handle.Init.Period = 1000-1; /* 自动装载值 */\n HAL_TIM_Base_Init(\u0026g_tim1_handle);\n\n HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 2); /* 设置中断优先级,抢占优先级1,子优先级3 */\n HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); /* 开启ITMx中断 */\n\n HAL_TIM_Base_Start_IT(\u0026g_tim1_handle); /* 使能定时器x和定时器x更新中断 */\n}\n\nint16_t speed=0,location=0;\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count\u003e20){\n count=0;\n OLED_Update();\n\n speed = Encoder_Get();\n location+=speed;\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef g_tim1_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器1句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_OFF\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能TIMx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim1_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器x */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim1_handle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 预分频系数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim1_handle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 递增计数模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim1_handle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 自动装载值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM1_UP_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置中断优先级,抢占优先级1,子优先级3 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM1_UP_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ITMx中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能定时器x和定时器x更新中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003espeed;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":38,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>TIM_HandleTypeDef g_tim1_handle; /* 定时器1句柄 */

void Timer_Init(){
LED_OFF();
__HAL_RCC_TIM1_CLK_ENABLE(); /* 使能TIMx时钟 */

g_tim1_handle.Instance = TIM1; /* 通用定时器x */
g_tim1_handle.Init.Prescaler = 72-1; /* 预分频系数 */
g_tim1_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_tim1_handle.Init.Period = 1000-1; /* 自动装载值 */
HAL_TIM_Base_Init(&amp;g_tim1_handle);

HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 2); /* 设置中断优先级,抢占优先级1,子优先级3 */
HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); /* 开启ITMx中断 */

HAL_TIM_Base_Start_IT(&amp;g_tim1_handle); /* 使能定时器x和定时器x更新中断 */
}

int16_t speed=0,location=0;
void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count>20){
count=0;
OLED_Update();

speed = Encoder_Get();
location+=speed;
}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef g_tim1_handle;</span><span style="color: #768390"> /* 定时器1句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">(){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_OFF</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_TIM1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能TIMx时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_tim1_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM1;</span><span style="color: #768390"> /* 通用定时器x */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim1_handle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">72</span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 预分频系数 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim1_handle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span><span style="color: #768390"> /* 递增计数模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim1_handle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 自动装载值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(TIM1_UP_IRQn, </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 设置中断优先级,抢占优先级1,子优先级3 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(TIM1_UP_IRQn);</span><span style="color: #768390"> /* 开启ITMx中断 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle);</span><span style="color: #768390"> /* 使能定时器x和定时器x更新中断 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">speed;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="mAuKS">KEY</h3>
<!-- /wp:heading -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(227,210,7,0.32) 0%,rgba(224,81,81,0.43) 99%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(227,210,7,0.32) 0%,rgba(224,81,81,0.43) 99%)"><!-- wp:paragraph -->
<p>⚠️注意:本文件是在作者以前项目上修改而成,因此宏定义不代表实际意义,也可能会出现一些魔法数字。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"#ifndef __KEY_H\n#define __KEY_H\n\n#include \u0022./SYSTEM/sys/sys.h\u0022\n\n/******************************************************************************************/\n/* 引脚 定义 */\n\n#define KEY0_GPIO_PORT GPIOB\n#define KEY0_GPIO_PIN GPIO_PIN_10\n#define KEY0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PE口时钟使能 */\n\n#define KEY1_GPIO_PORT GPIOB\n#define KEY1_GPIO_PIN GPIO_PIN_11\n#define KEY1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PE口时钟使能 */\n\n#define WKUP_GPIO_PORT GPIOA\n#define WKUP_GPIO_PIN GPIO_PIN_11\n#define WKUP_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */\n\n/******************************************************************************************/\n\n#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN) /* 读取KEY0引脚 */\n#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN) /* 读取KEY1引脚 */\n#define WK_UP HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN) /* 读取WKUP引脚 */\n\n#define KEY0_PRES 1 /* KEY0按下 */\n#define KEY1_PRES 2 /* KEY1按下 */\n#define WKUP_PRES 3 /* KEY_UP按下(即WK_UP) */\n\nvoid key_init(void); /* 按键初始化函数 */\nuint8_t Key_GetNum(void);\nvoid Key_Tick(void);\n\n//uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */\n\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__KEY_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__KEY_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 引脚 定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOB\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_10\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOB_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PE口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOB\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_11\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOB_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PE口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWKUP_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOA\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWKUP_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_11\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWKUP_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PA口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(KEY0_GPIO_PORT, KEY0_GPIO_PIN)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 读取KEY0引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(KEY1_GPIO_PORT, KEY1_GPIO_PIN)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 读取KEY1引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWK_UP\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(WKUP_GPIO_PORT, WKUP_GPIO_PIN)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 读取WKUP引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0_PRES\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY0按下 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1_PRES\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY1按下 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWKUP_PRES\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY_UP按下(即WK_UP) */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 按键初始化函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":38,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef __KEY_H
#define __KEY_H

#include "./SYSTEM/sys/sys.h"

/******************************************************************************************/
/* 引脚 定义 */

#define KEY0_GPIO_PORT GPIOB
#define KEY0_GPIO_PIN GPIO_PIN_10
#define KEY0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PE口时钟使能 */

#define KEY1_GPIO_PORT GPIOB
#define KEY1_GPIO_PIN GPIO_PIN_11
#define KEY1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PE口时钟使能 */

#define WKUP_GPIO_PORT GPIOA
#define WKUP_GPIO_PIN GPIO_PIN_11
#define WKUP_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

/******************************************************************************************/

#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN) /* 读取KEY0引脚 */
#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN) /* 读取KEY1引脚 */
#define WK_UP HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN) /* 读取WKUP引脚 */

#define KEY0_PRES 1 /* KEY0按下 */
#define KEY1_PRES 2 /* KEY1按下 */
#define WKUP_PRES 3 /* KEY_UP按下(即WK_UP) */

void key_init(void); /* 按键初始化函数 */
uint8_t Key_GetNum(void);
void Key_Tick(void);

//uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__KEY_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__KEY_H</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* 引脚 定义 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOB</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_10</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PE口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOB</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_11</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PE口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WKUP_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOA</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WKUP_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_11</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WKUP_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PA口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(KEY0_GPIO_PORT, KEY0_GPIO_PIN)</span><span style="color: #768390"> /* 读取KEY0引脚 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(KEY1_GPIO_PORT, KEY1_GPIO_PIN)</span><span style="color: #768390"> /* 读取KEY1引脚 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WK_UP</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(WKUP_GPIO_PORT, WKUP_GPIO_PIN)</span><span style="color: #768390"> /* 读取WKUP引脚 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0_PRES</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #768390"> /* KEY0按下 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1_PRES</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #768390"> /* KEY1按下 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WKUP_PRES</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #768390"> /* KEY_UP按下(即WK_UP) */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 按键初始化函数 */</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n\nuint8_t Key_Num;\n/**\n * @brief 按键初始化函数\n * @param 无\n * @retval 无\n */\nvoid key_init(void)\n{\n GPIO_InitTypeDef gpio_init_struct;\n KEY0_GPIO_CLK_ENABLE(); /* KEY0时钟使能 */\n KEY1_GPIO_CLK_ENABLE(); /* KEY1时钟使能 */\n WKUP_GPIO_CLK_ENABLE(); /* WKUP时钟使能 */\n\n gpio_init_struct.Pin = KEY0_GPIO_PIN; /* K1引脚 */\n gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */\n gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n HAL_GPIO_Init(KEY0_GPIO_PORT, \u0026gpio_init_struct); /* KEY0引脚模式设置,上拉输入 */\n\n gpio_init_struct.Pin = KEY1_GPIO_PIN; /* K2引脚 */\n HAL_GPIO_Init(KEY1_GPIO_PORT, \u0026gpio_init_struct); /* KEY1引脚模式设置,上拉输入 */\n\n gpio_init_struct.Pin = WKUP_GPIO_PIN; /* K3引脚 */\n HAL_GPIO_Init(WKUP_GPIO_PORT, \u0026gpio_init_struct); /* WKUP引脚模式设置,下拉输入 */\n\n gpio_init_struct.Pin = GPIO_PIN_12; /* K4引脚 */\n HAL_GPIO_Init(WKUP_GPIO_PORT, \u0026gpio_init_struct); /* WKUP引脚模式设置,下拉输入 */\n\n}\n\nuint8_t Key_GetState(void)\n{\n if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10) == 0)\n {\n return 1;\n }\n if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == 0)\n {\n return 2;\n }\n if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0)\n {\n return 3;\n }\n if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0)\n {\n return 4;\n }\n return 0;\n}\n\nuint8_t Key_GetNum(void)\n{\n uint8_t Temp;\n if (Key_Num)\n {\n Temp = Key_Num;\n Key_Num = 0;\n return Temp;\n }\n return 0;\n}\n\nvoid Key_Tick(void)\n{\n static uint8_t Count;\n static uint8_t CurrState, PrevState;\n\n Count ++;\n if (Count \u003e= 20)\n {\n Count = 0;\n\n PrevState = CurrState;\n CurrState = Key_GetState();\n\n if (CurrState == 0 \u0026\u0026 PrevState != 0){\n Key_Num = PrevState;\n }\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Key_Num;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 按键初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY0_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY0时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKEY1_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eWKUP_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* WKUP时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e KEY0_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* K1引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_INPUT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLUP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(KEY0_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY0引脚模式设置,上拉输入 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e KEY1_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* K2引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(KEY1_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* KEY1引脚模式设置,上拉输入 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e WKUP_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* K3引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(WKUP_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* WKUP引脚模式设置,下拉输入 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_12;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* K4引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(WKUP_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* WKUP引脚模式设置,下拉输入 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetState\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_10) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_11) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, GPIO_PIN_11) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, GPIO_PIN_12) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Key_Num)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Key_Num;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Key_Num \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Count;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CurrState, PrevState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Count \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Count \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Count \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PrevState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CurrState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CurrState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetState\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (CurrState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PrevState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Key_Num \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PrevState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":85,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"

uint8_t Key_Num;
/**
* @brief 按键初始化函数
* @param 无
* @retval 无
*/
void key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
KEY0_GPIO_CLK_ENABLE(); /* KEY0时钟使能 */
KEY1_GPIO_CLK_ENABLE(); /* KEY1时钟使能 */
WKUP_GPIO_CLK_ENABLE(); /* WKUP时钟使能 */

gpio_init_struct.Pin = KEY0_GPIO_PIN; /* K1引脚 */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(KEY0_GPIO_PORT, &amp;gpio_init_struct); /* KEY0引脚模式设置,上拉输入 */

gpio_init_struct.Pin = KEY1_GPIO_PIN; /* K2引脚 */
HAL_GPIO_Init(KEY1_GPIO_PORT, &amp;gpio_init_struct); /* KEY1引脚模式设置,上拉输入 */

gpio_init_struct.Pin = WKUP_GPIO_PIN; /* K3引脚 */
HAL_GPIO_Init(WKUP_GPIO_PORT, &amp;gpio_init_struct); /* WKUP引脚模式设置,下拉输入 */

gpio_init_struct.Pin = GPIO_PIN_12; /* K4引脚 */
HAL_GPIO_Init(WKUP_GPIO_PORT, &amp;gpio_init_struct); /* WKUP引脚模式设置,下拉输入 */

}

uint8_t Key_GetState(void)
{
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10) == 0)
{
return 1;
}
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) == 0)
{
return 2;
}
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == 0)
{
return 3;
}
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == 0)
{
return 4;
}
return 0;
}

uint8_t Key_GetNum(void)
{
uint8_t Temp;
if (Key_Num)
{
Temp = Key_Num;
Key_Num = 0;
return Temp;
}
return 0;
}

void Key_Tick(void)
{
static uint8_t Count;
static uint8_t CurrState, PrevState;

Count ++;
if (Count >= 20)
{
Count = 0;

PrevState = CurrState;
CurrState = Key_GetState();

if (CurrState == 0 &amp;&amp; PrevState != 0){
Key_Num = PrevState;
}
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> Key_Num;</span></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 按键初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY0_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* KEY0时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">KEY1_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* KEY1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">WKUP_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* WKUP时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> KEY0_GPIO_PIN;</span><span style="color: #768390"> /* K1引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_INPUT;</span><span style="color: #768390"> /* 输入 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLUP;</span><span style="color: #768390"> /* 上拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(KEY0_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* KEY0引脚模式设置,上拉输入 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> KEY1_GPIO_PIN;</span><span style="color: #768390"> /* K2引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(KEY1_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* KEY1引脚模式设置,上拉输入 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> WKUP_GPIO_PIN;</span><span style="color: #768390"> /* K3引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(WKUP_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* WKUP引脚模式设置,下拉输入 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_12;</span><span style="color: #768390"> /* K4引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(WKUP_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* WKUP引脚模式设置,下拉输入 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_GetState</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_10) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_11) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(GPIOA, GPIO_PIN_11) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">HAL_GPIO_ReadPin</span><span style="color: #ADBAC7">(GPIOA, GPIO_PIN_12) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> Temp;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (Key_Num)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> Temp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Key_Num;</span></span>
<span class="line"><span style="color: #ADBAC7"> Key_Num </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> Temp;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> Count;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> CurrState, PrevState;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Count </span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (Count </span><span style="color: #F47067">&gt;=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> Count </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> PrevState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> CurrState;</span></span>
<span class="line"><span style="color: #ADBAC7"> CurrState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_GetState</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (CurrState </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&amp;&amp;</span><span style="color: #ADBAC7"> PrevState </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Key_Num </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> PrevState;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="AF4Do">LED</h3>
<!-- /wp:heading -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"#ifndef _LED_H\n#define _LED_H\n#include \u0022./SYSTEM/sys/sys.h\u0022\n\n/******************************************************************************************/\n/* 引脚 定义 */\n\n#define LED0_GPIO_PORT GPIOC\n#define LED0_GPIO_PIN GPIO_PIN_13\n#define LED0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PC口时钟使能 */\n\n/******************************************************************************************/\n/* LED端口定义 */\n#define LED0(x) do{ x ? \n HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) : \n HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); \n }while(0) /* LED0翻转 */\n\n#define LED_ON() LED0(0)\n#define LED_OFF() LED0(1)\n\n/* LED取反定义 */\n#define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0) /* 翻转LED0 */\n#define LED_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0)\n\n/******************************************************************************************/\n/* 外部接口函数*/\nvoid led_init(void); /* 初始化 */\n\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e_LED_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e_LED_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 引脚 定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOC\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_13\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOC_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PC口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* LED端口定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ex\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ x \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e?\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e:\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* LED0翻转 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_OFF\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* LED取反定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0_TOGGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_TogglePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(LED0_GPIO_PORT, LED0_GPIO_PIN); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 翻转LED0 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_TOGGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_TogglePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(LED0_GPIO_PORT, LED0_GPIO_PIN); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 外部接口函数*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":31,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/sys/sys.h"

/******************************************************************************************/
/* 引脚 定义 */

#define LED0_GPIO_PORT GPIOC
#define LED0_GPIO_PIN GPIO_PIN_13
#define LED0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PC口时钟使能 */

/******************************************************************************************/
/* LED端口定义 */
#define LED0(x) do{ x ?
HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET);
}while(0) /* LED0翻转 */

#define LED_ON() LED0(0)
#define LED_OFF() LED0(1)

/* LED取反定义 */
#define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0) /* 翻转LED0 */
#define LED_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0)

/******************************************************************************************/
/* 外部接口函数*/
void led_init(void); /* 初始化 */

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">_LED_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">_LED_H</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* 引脚 定义 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOC</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_13</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOC_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PC口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* LED端口定义 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">x</span><span style="color: #ADBAC7">) </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ x </span><span style="color: #F47067">?</span><span style="color: #ADBAC7"> </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) </span><span style="color: #F47067">:</span><span style="color: #ADBAC7"> </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); </span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* LED0翻转 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">() </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_OFF</span><span style="color: #ADBAC7">() </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* LED取反定义 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0_TOGGLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">HAL_GPIO_TogglePin</span><span style="color: #ADBAC7">(LED0_GPIO_PORT, LED0_GPIO_PIN); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 翻转LED0 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_TOGGLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">HAL_GPIO_TogglePin</span><span style="color: #ADBAC7">(LED0_GPIO_PORT, LED0_GPIO_PIN); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* 外部接口函数*/</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"\n#include \u0022./BSP/LED/led.h\u0022\n\nvoid led_init(void)\n{\n GPIO_InitTypeDef gpio_init_struct;\n LED0_GPIO_CLK_ENABLE(); /* LED0时钟使能 */\n\n gpio_init_struct.Pin = LED0_GPIO_PIN; /* LED0引脚 */\n gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */\n gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n HAL_GPIO_Init(LED0_GPIO_PORT, \u0026gpio_init_struct); /* 初始化LED0引脚 */\n\n LED0(1); /* 关闭 LED0 */\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* LED0时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LED0_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* LED0引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_OUTPUT_PP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 推挽输出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLUP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(LED0_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化LED0引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 关闭 LED0 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":17,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
#include "./BSP/LED/led.h"

void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
LED0_GPIO_CLK_ENABLE(); /* LED0时钟使能 */

gpio_init_struct.Pin = LED0_GPIO_PIN; /* LED0引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(LED0_GPIO_PORT, &amp;gpio_init_struct); /* 初始化LED0引脚 */

LED0(1); /* 关闭 LED0 */
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* LED0时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> LED0_GPIO_PIN;</span><span style="color: #768390"> /* LED0引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_OUTPUT_PP;</span><span style="color: #768390"> /* 推挽输出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLUP;</span><span style="color: #768390"> /* 上拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(LED0_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* 初始化LED0引脚 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 关闭 LED0 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="fQiGS">ADC(用于电位器)</h3>
<!-- /wp:heading -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"/*\n#define RP_Init ADC2_Init\n#define RP_GetValue(x) ADC2_get_result(x+1)\nvoid ADC2_Init();\nuint32_t ADC2_get_result(uint8_t ch);\n这四个是电位器用到的\n*/\n#ifndef __ADC_H\n#define __ADC_H\n\n#include \u0022./SYSTEM/sys/sys.h\u0022\n\n#define ADC_DMA_BUF_SIZE 1 * 4 /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 */\n\n/******************************************************************************************/\n/* ADC及引脚 定义 */\n\n#define ADC_ADCX_CHY_GPIO_PORT GPIOA\n#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_1 \n#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */\n\n#define ADC_ADCX ADC1 \n#define ADC_ADCX_CHY ADC_CHANNEL_1 /* 通道Y, 0 \u003c= Y \u003c= 17 */ \n#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0) /* ADC1 时钟使能 */\n\n/* ADC单通道/多通道 DMA采集 DMA及通道 定义\n * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的\n * ADC2不支持DMA采集\n * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改\n */\n#define ADC_ADCX_DMACx DMA1_Channel1\n#define ADC_ADCX_DMACx_IRQn DMA1_Channel1_IRQn\n#define ADC_ADCX_DMACx_IRQHandler DMA1_Channel1_IRQHandler\n\n#define ADC_ADCX_DMACx_IS_TC() ( DMA1-\u003eISR \u0026 (1 \u003c\u003c 1) ) /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,\n * 不能当函数使用, 只能用在if等语句里面 \n */\n#define ADC_ADCX_DMACx_CLR_TC() do{ DMA1-\u003eIFCR |= 1 \u003c\u003c 1; }while(0) /* 清除 DMA1_Channel1 传输完成标志 */\n\n#define RP_Init ADC2_Init\n#define RP_GetValue(x) ADC2_get_result(x+1)\n/******************************************************************************************/\n\nvoid adc_init(void); /* ADC初始化 */\nvoid adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch,uint32_t rank, uint32_t stime); /* ADC通道设置 */\nuint32_t adc_get_result(uint32_t ch); /* 获得某个通道值 */\nuint32_t adc_get_result_average(uint32_t ch, uint8_t times); /* 得到某个通道给定次数采样的平均值 */\n\nvoid adc_dma_init(uint32_t mar); /* ADC DMA采集初始化 */\nvoid adc_dma_enable( uint16_t cndtr); /* 使能一次ADC DMA采集传输 */\n\nvoid adc_nch_dma_init(uint32_t mar); /* ADC多通道 DMA采集初始化 */\n\nvoid ADC2_Init();\nuint32_t ADC2_get_result(uint8_t ch);\n\n#endif \n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e#define RP_Init ADC2_Init\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e#define RP_GetValue(x) ADC2_get_result(x+1)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003evoid ADC2_Init();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003euint32_t ADC2_get_result(uint8_t ch);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e这四个是电位器用到的\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ADC_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ADC_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_DMA_BUF_SIZE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* ADC及引脚 定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOA\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_1 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PA口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC1 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y, 0 \u0026lt;= Y \u0026lt;= 17 */\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_ADC1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC1 时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* ADC单通道/多通道 DMA采集 DMA及通道 定义\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * ADC2不支持DMA采集\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1_IRQn\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IS_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() ( DMA1-\u0026gt;ISR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) )\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 不能当函数使用, 只能用在if等语句里面 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_CLR_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ DMA1-\u0026gt;IFCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e; }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除 DMA1_Channel1 传输完成标志 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC2_Init\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ex\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(x\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadc_handle\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 获得某个通道值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result_average\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 得到某个通道给定次数采样的平均值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC DMA采集初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e( \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ecndtr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能一次ADC DMA采集传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_nch_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC多通道 DMA采集初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":58,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/*
#define RP_Init ADC2_Init
#define RP_GetValue(x) ADC2_get_result(x+1)
void ADC2_Init();
uint32_t ADC2_get_result(uint8_t ch);
这四个是电位器用到的
*/
#ifndef __ADC_H
#define __ADC_H

#include "./SYSTEM/sys/sys.h"

#define ADC_DMA_BUF_SIZE 1 * 4 /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 */

/******************************************************************************************/
/* ADC及引脚 定义 */

#define ADC_ADCX_CHY_GPIO_PORT GPIOA
#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_1
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

#define ADC_ADCX ADC1
#define ADC_ADCX_CHY ADC_CHANNEL_1 /* 通道Y, 0 &lt;= Y &lt;= 17 */
#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0) /* ADC1 时钟使能 */

/* ADC单通道/多通道 DMA采集 DMA及通道 定义
* 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的
* ADC2不支持DMA采集
* ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改
*/
#define ADC_ADCX_DMACx DMA1_Channel1
#define ADC_ADCX_DMACx_IRQn DMA1_Channel1_IRQn
#define ADC_ADCX_DMACx_IRQHandler DMA1_Channel1_IRQHandler

#define ADC_ADCX_DMACx_IS_TC() ( DMA1->ISR &amp; (1 &lt;&lt; 1) ) /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,
* 不能当函数使用, 只能用在if等语句里面
*/
#define ADC_ADCX_DMACx_CLR_TC() do{ DMA1->IFCR |= 1 &lt;&lt; 1; }while(0) /* 清除 DMA1_Channel1 传输完成标志 */

#define RP_Init ADC2_Init
#define RP_GetValue(x) ADC2_get_result(x+1)
/******************************************************************************************/

void adc_init(void); /* ADC初始化 */
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch,uint32_t rank, uint32_t stime); /* ADC通道设置 */
uint32_t adc_get_result(uint32_t ch); /* 获得某个通道值 */
uint32_t adc_get_result_average(uint32_t ch, uint8_t times); /* 得到某个通道给定次数采样的平均值 */

void adc_dma_init(uint32_t mar); /* ADC DMA采集初始化 */
void adc_dma_enable( uint16_t cndtr); /* 使能一次ADC DMA采集传输 */

void adc_nch_dma_init(uint32_t mar); /* ADC多通道 DMA采集初始化 */

void ADC2_Init();
uint32_t ADC2_get_result(uint8_t ch);

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390">#define RP_Init ADC2_Init</span></span>
<span class="line"><span style="color: #768390">#define RP_GetValue(x) ADC2_get_result(x+1)</span></span>
<span class="line"><span style="color: #768390">void ADC2_Init();</span></span>
<span class="line"><span style="color: #768390">uint32_t ADC2_get_result(uint8_t ch);</span></span>
<span class="line"><span style="color: #768390">这四个是电位器用到的</span></span>
<span class="line"><span style="color: #768390">*/</span></span>
<span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ADC_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ADC_H</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_DMA_BUF_SIZE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #768390"> /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* ADC及引脚 定义 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOA</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_1 </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PA口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX</span><span style="color: #ADBAC7"> ADC1 </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY</span><span style="color: #ADBAC7"> ADC_CHANNEL_1</span><span style="color: #768390"> /* 通道Y, 0 &lt;= Y &lt;= 17 */</span><span style="color: #ADBAC7"> </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_ADC1_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* ADC1 时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* ADC单通道/多通道 DMA采集 DMA及通道 定义</span></span>
<span class="line"><span style="color: #768390"> * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的</span></span>
<span class="line"><span style="color: #768390"> * ADC2不支持DMA采集</span></span>
<span class="line"><span style="color: #768390"> * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx</span><span style="color: #ADBAC7"> DMA1_Channel1</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQn</span><span style="color: #ADBAC7"> DMA1_Channel1_IRQn</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQHandler</span><span style="color: #ADBAC7"> DMA1_Channel1_IRQHandler</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IS_TC</span><span style="color: #ADBAC7">() ( DMA1-&gt;ISR </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">) )</span><span style="color: #768390"> /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,</span></span>
<span class="line"><span style="color: #768390"> * 不能当函数使用, 只能用在if等语句里面 </span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_CLR_TC</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ DMA1-&gt;IFCR </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">; }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 清除 DMA1_Channel1 传输完成标志 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7"> ADC2_Init</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">x</span><span style="color: #ADBAC7">) </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(x</span><span style="color: #F47067">+</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC初始化 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">adc_handle</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">rank</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">stime</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC通道设置 */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 获得某个通道值 */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result_average</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">times</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 得到某个通道给定次数采样的平均值 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC DMA采集初始化 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">( </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">cndtr</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 使能一次ADC DMA采集传输 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_nch_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC多通道 DMA采集初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span><span style="color: #ADBAC7"> </span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n\nADC_HandleTypeDef g_adc_handle; /* ADC句柄 */\n\n/**\n * @brief ADC初始化函数\n * @note 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3\n * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期\n * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us\n * @param 无\n * @retval 无\n */\nvoid adc_init(void)\n{\n g_adc_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */\n g_adc_handle.Init.ContinuousConvMode = DISABLE; /* 关闭连续转换模式 */\n g_adc_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */\n g_adc_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */\n HAL_ADC_Init(\u0026amp;g_adc_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026amp;g_adc_handle); /* 校准ADC */\n}\n\n/**\n * @brief ADC底层驱动,引脚配置,时钟使能\n 此函数会被HAL_ADC_Init()调用\n * @param hadc:ADC句柄\n * @retval 无\n */\nvoid HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)\n{\n if(hadc-\u003eInstance == ADC_ADCX)\n {\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026amp;adc_clk_init); /* 设置ADC时钟 */\n\n /* 设置AD采集通道对应IO引脚工作模式 */\n gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道IO引脚 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, \u0026amp;gpio_init_struct);\n }\n}\n\n/**\n * @brief 设置ADC通道采样时间\n * @param adcx : adc句柄指针,ADC_HandleTypeDef\n * @param ch : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17\n * @param stime: 采样时间 0~7, 对应关系为:\n * @arg ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期\n * @param rank: 多通道采集时需要设置的采集编号,\n 假设你定义channle1的rank=1,channle2 的rank=2,\n 那么对应你在DMA缓存空间的变量数组AdcDMA[0] 就i是channle1的转换结果,AdcDMA[1]就是通道2的转换结果。 \n 单通道DMA设置为 ADC_REGULAR_RANK_1\n * @arg 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16\n * @retval 无\n */\nvoid adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)\n{\n ADC_ChannelConfTypeDef adc_ch_conf;\n\n adc_ch_conf.Channel = ch; /* 通道 */\n adc_ch_conf.Rank = rank; /* 序列 */\n adc_ch_conf.SamplingTime = stime; /* 采样时间 */\n HAL_ADC_ConfigChannel(adc_handle, \u0026amp;adc_ch_conf); /* 通道配置 */\n}\n\n/**\n * @brief 获得ADC转换后的结果\n * @param ch: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17\n * @retval 无\n */\nuint32_t adc_get_result(uint32_t ch)\n{\n adc_channel_set(\u0026amp;g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */\n\n HAL_ADC_Start(\u0026amp;g_adc_handle); /* 开启ADC */\n HAL_ADC_PollForConversion(\u0026amp;g_adc_handle, 10); /* 轮询转换 */\n return (uint16_t)HAL_ADC_GetValue(\u0026amp;g_adc_handle); /* 返回最近一次ADC1规则组的转换结果 */\n}\n\n/**\n * @brief 获取通道ch的转换值,取times次,然后平均\n * @param ch : 通道号, 0~17\n * @param times : 获取次数\n * @retval 通道ch的times次转换结果平均值\n */\nuint32_t adc_get_result_average(uint32_t ch, uint8_t times)\n{\n uint32_t temp_val = 0;\n uint8_t t;\n\n for (t = 0; t \u0026lt; times; t++) /* 获取times次数据 */\n {\n temp_val += adc_get_result(ch);\n delay_ms(5);\n }\n\n return temp_val / times; /* 返回平均值 */\n}\n\n/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/\n\nDMA_HandleTypeDef g_dma_adc_handle = {0}; /* 定义要搬运ADC数据的DMA句柄 */\nADC_HandleTypeDef g_adc_dma_handle = {0}; /* 定义ADC(DMA读取)句柄 */\nuint8_t g_adc_dma_sta = 0; /* DMA传输状态标志, 0,未完成; 1, 已完成 */\n\n/**\n * @brief ADC DMA读取 初始化函数\n * @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\n * @param par : 外设地址\n * @param mar : 存储器地址\n * @retval 无\n */\nvoid adc_dma_init(uint32_t mar)\n{\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026amp;adc_clk_init); /* 设置ADC时钟 */\n\n /* 设置AD采集通道对应IO引脚工作模式 */\n gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道对应的IO引脚 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, \u0026amp;gpio_init_struct);\n\n /* 初始化DMA */\n g_dma_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */\n g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */\n g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */\n g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */\n g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */\n g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */\n g_dma_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */\n g_dma_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */\n HAL_DMA_Init(\u0026amp;g_dma_adc_handle);\n\n __HAL_LINKDMA(\u0026amp;g_adc_dma_handle, DMA_Handle, g_dma_adc_handle); /* 将DMA与adc联系起来 */\n\n g_adc_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */\n g_adc_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换模式 */\n g_adc_dma_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */\n g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */\n HAL_ADC_Init(\u0026amp;g_adc_dma_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026amp;g_adc_dma_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_ADCX_CHY; /* 通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 序列 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc_dma_handle, \u0026amp;adc_ch_conf); /* 通道配置 */\n\n /* 配置DMA数据流请求中断优先级 */\n HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);\n HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);\n\n HAL_DMA_Start_IT(\u0026amp;g_dma_adc_handle, (uint32_t)\u0026amp;ADC1-\u003eDR, mar, 0); /* 启动DMA,并开启中断 */\n HAL_ADC_Start_DMA(\u0026amp;g_adc_dma_handle, \u0026amp;mar, 0); /* 开启ADC,通过DMA传输结果 */\n}\n\n/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\n\nDMA_HandleTypeDef g_dma_nch_adc_handle = {0}; /* 定义要搬运ADC多通道数据的DMA句柄 */\nADC_HandleTypeDef g_adc_nch_dma_handle = {0}; /* 定义ADC(多通道DMA读取)句柄 */\n\n/**\n * @brief ADC N通道(6通道) DMA读取 初始化函数\n * @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\n * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,\n * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.\n *\n * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义\n * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.\n *\n * @param mar : 存储器地址 \n * @retval 无\n */\nvoid adc_nch_dma_init(uint32_t mar)\n{\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n __HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026amp;adc_clk_init); /* 设置ADC时钟 */\n\n /* \n 设置ADC1通道0~5对应的IO口模拟输入\n AD采集引脚模式设置,模拟输入\n PA0对应 ADC1_IN0\n PA1对应 ADC1_IN1\n PA2对应 ADC1_IN2\n PA3对应 ADC1_IN3\n PA4对应 ADC1_IN4\n PA5对应 ADC1_IN5\n */\n gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(GPIOA, \u0026amp;gpio_init_struct);\n\n /* 初始化DMA */\n g_dma_nch_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */\n g_dma_nch_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */\n g_dma_nch_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */\n g_dma_nch_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */\n g_dma_nch_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */\n g_dma_nch_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */\n g_dma_nch_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */\n g_dma_nch_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */\n HAL_DMA_Init(\u0026amp;g_dma_nch_adc_handle);\n\n __HAL_LINKDMA(\u0026amp;g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle); /* 将DMA与adc联系起来 */\n\n /* 初始化ADC */\n g_adc_nch_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_nch_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_nch_dma_handle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* 使能扫描模式 */\n g_adc_nch_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */\n g_adc_nch_dma_handle.Init.NbrOfConversion = 6; /* 赋值范围是1~16,本实验用到6个规则通道序列 */\n g_adc_nch_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_nch_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_nch_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */\n HAL_ADC_Init(\u0026amp;g_adc_nch_dma_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026amp;g_adc_nch_dma_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 通道配置 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */\n// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */\n// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n /* 配置DMA数据流请求中断优先级 */\n HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);\n HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);\n\n HAL_DMA_Start_IT(\u0026amp;g_dma_nch_adc_handle, (uint32_t)\u0026amp;ADC1-\u003eDR, mar, 0); /* 启动DMA,并开启中断 */\n HAL_ADC_Start_DMA(\u0026amp;g_adc_nch_dma_handle, \u0026amp;mar, 0); /* 开启ADC,通过DMA传输结果 */\n}\n\n/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\n\n/**\n * @brief 使能一次ADC DMA传输\n * @note 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性\n * @param ndtr: DMA传输的次数\n * @retval 无\n */\nvoid adc_dma_enable(uint16_t cndtr)\n{\n ADC_ADCX-\u003eCR2 \u0026amp;= ~(1 \u0026lt;\u0026lt; 0); /* 先关闭ADC */\n\n ADC_ADCX_DMACx-\u003eCCR \u0026amp;= ~(1 \u0026lt;\u0026lt; 0); /* 关闭DMA传输 */\n while (ADC_ADCX_DMACx-\u003eCCR \u0026amp; (1 \u0026lt;\u0026lt; 0)); /* 确保DMA可以被设置 */\n ADC_ADCX_DMACx-\u003eCNDTR = cndtr; /* DMA传输数据量 */\n ADC_ADCX_DMACx-\u003eCCR |= 1 \u0026lt;\u0026lt; 0; /* 开启DMA传输 */\n\n ADC_ADCX-\u003eCR2 |= 1 \u0026lt;\u0026lt; 0; /* 重新启动ADC */\n ADC_ADCX-\u003eCR2 |= 1 \u0026lt;\u0026lt; 22; /* 启动规则转换通道 */\n}\n\n/**\n * @brief ADC DMA采集中断服务函数\n * @param 无 \n * @retval 无\n */\nvoid ADC_ADCX_DMACx_IRQHandler(void)\n{\n if (ADC_ADCX_DMACx_IS_TC())\n {\n g_adc_dma_sta = 1; /* 标记DMA传输完成 */\n ADC_ADCX_DMACx_CLR_TC(); /* 清除DMA1 数据流7 传输完成中断 */\n }\n}\n\nADC_HandleTypeDef g_adc2_handle;\nADC_HandleTypeDef g_adc1_handle;\nvoid ADC2_Init(){\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n __HAL_RCC_ADC2_CLK_ENABLE(); /* 使能ADCx时钟 */\n __HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026amp;adc_clk_init); /* 设置ADC时钟 */\n\n /* \n 设置ADC1通道0~5对应的IO口模拟输入\n AD采集引脚模式设置,模拟输入\n PA0对应 ADC1_IN0\n PA1对应 ADC1_IN1\n PA2对应 ADC1_IN2\n PA3对应 ADC1_IN3\n PA4对应 ADC1_IN4\n PA5对应 ADC1_IN5\n */\n gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(GPIOA, \u0026amp;gpio_init_struct);\n\n /* 初始化ADC */\n g_adc2_handle.Instance = ADC2; /* 选择哪个ADC */\n g_adc2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc2_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 使能扫描模式 */\n g_adc2_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */\n g_adc2_handle.Init.NbrOfConversion = 4; /* 赋值范围是1~16,本实验用到6个规则通道序列 */\n g_adc2_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc2_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */\n HAL_ADC_Init(\u0026amp;g_adc2_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026amp;g_adc2_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc2_handle, \u0026amp;adc_ch_conf); /* 通道配置 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc2_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc2_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */\n HAL_ADC_ConfigChannel(\u0026amp;g_adc2_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\n\n HAL_ADC_Start_IT(\u0026amp;g_adc2_handle); //开启转换并触发中断\n HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); // 设置中断优先级\n HAL_NVIC_EnableIRQ(ADC1_2_IRQn); // 使能 ADC1 和 ADC2 的中断\n}\n\nvoid HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)\n{\n// static uint8_t ADC2CH=0;\n// if (hadc-\u003eInstance == ADC2)\n// {\n// \n// g_adc_dma_buf[ADC2CH++] = HAL_ADC_GetValue(hadc);\n// if(ADC2CH==4)ADC2CH=0;\n// \n// }\n}\n\nvoid ADC1_2_IRQHandler(void)\n{\n if (__HAL_ADC_GET_FLAG(\u0026amp;g_adc2_handle, ADC_FLAG_EOC) != RESET)\n {\n HAL_ADC_IRQHandler(\u0026amp;g_adc2_handle); // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler\n }\n\n // 检查 ADC2 是否触发了中断\n if (__HAL_ADC_GET_FLAG(\u0026amp;g_adc1_handle, ADC_FLAG_EOC) != RESET)\n {\n HAL_ADC_IRQHandler(\u0026amp;g_adc1_handle); // 将 adc1 的地址传递给 HAL_ADC_IRQHandler\n }\n}\n\nuint32_t ADC2_get_result(uint8_t ch)\n{\n adc_channel_set(\u0026amp;g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */\n\n HAL_ADC_Start(\u0026amp;g_adc2_handle); /* 开启ADC */\n HAL_ADC_PollForConversion(\u0026amp;g_adc2_handle, 10); /* 轮询转换 */\n return (uint16_t)HAL_ADC_GetValue(\u0026amp;g_adc2_handle); /* 返回最近一次ADC1规则组的转换结果 */\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 非扫描模式,仅用到一个通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 关闭连续转换模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到1个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 触发转换方式:软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC底层驱动,引脚配置,时钟使能\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 此函数会被HAL_ADC_Init()调用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:ADC句柄\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_MspInit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(hadc-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIO时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置AD采集通道对应IO引脚工作模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道IO引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC通道采样时间\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadcx\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : adc句柄指针,ADC_HandleTypeDef\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 采样时间 0~7, 对应关系为:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 多通道采集时需要设置的采集编号,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 假设你定义channle1的rank=1,channle2 的rank=2,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 那么对应你在DMA缓存空间的变量数组AdcDMA\u0026#91;0\u0026#93; 就i是channle1的转换结果,AdcDMA\u0026#91;1\u0026#93;就是通道2的转换结果。 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 单通道DMA设置为 ADC_REGULAR_RANK_1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadc_handle\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ch;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e rank;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e stime;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(adc_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 获得ADC转换后的结果\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置通道,序列和采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_PollForConversion\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 轮询转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回最近一次ADC1规则组的转换结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 获取通道ch的转换值,取times次,然后平均\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 通道号, 0~17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 获取次数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通道ch的times次转换结果平均值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result_average\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e t;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efor\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (t \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e; t \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e times; t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 获取times次数据 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ch);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e times;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回平均值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eDMA_HandleTypeDef g_dma_adc_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义要搬运ADC数据的DMA句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_dma_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义ADC(DMA读取)句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA传输状态标志, 0,未完成; 1, 已完成 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC DMA读取 初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 外设地址\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 存储器地址\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIO时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置AD采集通道对应IO引脚工作模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道对应的IO引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化DMA */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置DMA通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Direction \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PERIPH_TO_MEMORY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 从外设到存储器模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.PeriphInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PINC_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设非增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.MemInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MINC_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.PeriphDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.MemDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_NORMAL;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设流控模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Priority \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PRIORITY_MEDIUM;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 中等优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_adc_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_LINKDMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, DMA_Handle, g_dma_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 将DMA与adc联系起来 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 非扫描模式,仅用到一个通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到1个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 触发转换方式:软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置DMA数据流请求中断优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_adc_handle, (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC1-\u0026gt;DR, mar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动DMA,并开启中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_DMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003emar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC,通过DMA传输结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eDMA_HandleTypeDef g_dma_nch_adc_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义要搬运ADC多通道数据的DMA句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_nch_dma_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义ADC(多通道DMA读取)句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC N通道(6通道) DMA读取 初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 存储器地址 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_nch_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIOA时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC1通道0~5对应的IO口模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e AD采集引脚模式设置,模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA0对应 ADC1_IN0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA1对应 ADC1_IN1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA2对应 ADC1_IN2\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA3对应 ADC1_IN3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA4对应 ADC1_IN4\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA5对应 ADC1_IN5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_3\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_4\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* GPIOA0~5 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化DMA */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置DMA通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Direction \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PERIPH_TO_MEMORY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 从外设到存储器模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.PeriphInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PINC_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设非增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.MemInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MINC_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.PeriphDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.MemDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_NORMAL;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设流控模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Priority \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PRIORITY_MEDIUM;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 中等优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_nch_adc_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_LINKDMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 将DMA与adc联系起来 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能扫描模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e6\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到6个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第1个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第2个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第3个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第4个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置DMA数据流请求中断优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_nch_adc_handle, (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC1-\u0026gt;DR, mar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动DMA,并开启中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_DMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003emar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC,通过DMA传输结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 使能一次ADC DMA传输\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003endtr\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: DMA传输的次数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ecndtr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e~\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 先关闭ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e~\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 关闭DMA传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 确保DMA可以被设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CNDTR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e cndtr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA传输数据量 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启DMA传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 重新启动ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e22\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动规则转换通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC DMA采集中断服务函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IS_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e())\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 标记DMA传输完成 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_CLR_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除DMA1 数据流7 传输完成中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc2_handle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc1_handle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_ADC2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIOA时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC1通道0~5对应的IO口模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e AD采集引脚模式设置,模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA0对应 ADC1_IN0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA1对应 ADC1_IN1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA2对应 ADC1_IN2\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA3对应 ADC1_IN3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA4对应 ADC1_IN4\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA5对应 ADC1_IN5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_3\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_4\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* GPIOA0~5 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能扫描模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到6个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第1个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第2个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第3个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第4个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //开启转换并触发中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC1_2_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 设置中断优先级\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC1_2_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 使能 ADC1 和 ADC2 的中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConvCpltCallback\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// static uint8_t ADC2CH=0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// if (hadc-\u0026gt;Instance == ADC2)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// g_adc_dma_buf\u0026#91;ADC2CH++\u0026#93; = HAL_ADC_GetValue(hadc);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// if(ADC2CH==4)ADC2CH=0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC1_2_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_ADC_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, ADC_FLAG_EOC) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// 检查 ADC2 是否触发了中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_ADC_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc1_handle, ADC_FLAG_EOC) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc1_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 将 adc1 的地址传递给 HAL_ADC_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置通道,序列和采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_PollForConversion\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 轮询转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回最近一次ADC1规则组的转换结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":455,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
#include "./BSP/ADC/adc.h"
#include "./SYSTEM/delay/delay.h"

ADC_HandleTypeDef g_adc_handle; /* ADC句柄 */

/**
* @brief ADC初始化函数
* @note 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3
* 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期
* 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us
* @param 无
* @retval 无
*/
void adc_init(void)
{
g_adc_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */
g_adc_handle.Init.ContinuousConvMode = DISABLE; /* 关闭连续转换模式 */
g_adc_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */
g_adc_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */
HAL_ADC_Init(&amp;g_adc_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_handle); /* 校准ADC */
}

/**
* @brief ADC底层驱动,引脚配置,时钟使能
此函数会被HAL_ADC_Init()调用
* @param hadc:ADC句柄
* @retval 无
*/
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
if(hadc->Instance == ADC_ADCX)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/* 设置AD采集通道对应IO引脚工作模式 */
gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道IO引脚 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &amp;gpio_init_struct);
}
}

/**
* @brief 设置ADC通道采样时间
* @param adcx : adc句柄指针,ADC_HandleTypeDef
* @param ch : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17
* @param stime: 采样时间 0~7, 对应关系为:
* @arg ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期
* @arg ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期
* @arg ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期
* @arg ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期
* @param rank: 多通道采集时需要设置的采集编号,
假设你定义channle1的rank=1,channle2 的rank=2,
那么对应你在DMA缓存空间的变量数组AdcDMA&#91;0&#93; 就i是channle1的转换结果,AdcDMA&#91;1&#93;就是通道2的转换结果。
单通道DMA设置为 ADC_REGULAR_RANK_1
* @arg 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16
* @retval 无
*/
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
{
ADC_ChannelConfTypeDef adc_ch_conf;

adc_ch_conf.Channel = ch; /* 通道 */
adc_ch_conf.Rank = rank; /* 序列 */
adc_ch_conf.SamplingTime = stime; /* 采样时间 */
HAL_ADC_ConfigChannel(adc_handle, &amp;adc_ch_conf); /* 通道配置 */
}

/**
* @brief 获得ADC转换后的结果
* @param ch: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17
* @retval 无
*/
uint32_t adc_get_result(uint32_t ch)
{
adc_channel_set(&amp;g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */

HAL_ADC_Start(&amp;g_adc_handle); /* 开启ADC */
HAL_ADC_PollForConversion(&amp;g_adc_handle, 10); /* 轮询转换 */
return (uint16_t)HAL_ADC_GetValue(&amp;g_adc_handle); /* 返回最近一次ADC1规则组的转换结果 */
}

/**
* @brief 获取通道ch的转换值,取times次,然后平均
* @param ch : 通道号, 0~17
* @param times : 获取次数
* @retval 通道ch的times次转换结果平均值
*/
uint32_t adc_get_result_average(uint32_t ch, uint8_t times)
{
uint32_t temp_val = 0;
uint8_t t;

for (t = 0; t &lt; times; t++) /* 获取times次数据 */
{
temp_val += adc_get_result(ch);
delay_ms(5);
}

return temp_val / times; /* 返回平均值 */
}

/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/

DMA_HandleTypeDef g_dma_adc_handle = {0}; /* 定义要搬运ADC数据的DMA句柄 */
ADC_HandleTypeDef g_adc_dma_handle = {0}; /* 定义ADC(DMA读取)句柄 */
uint8_t g_adc_dma_sta = 0; /* DMA传输状态标志, 0,未完成; 1, 已完成 */

/**
* @brief ADC DMA读取 初始化函数
* @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置
* @param par : 外设地址
* @param mar : 存储器地址
* @retval 无
*/
void adc_dma_init(uint32_t mar)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/* 设置AD采集通道对应IO引脚工作模式 */
gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道对应的IO引脚 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &amp;gpio_init_struct);

/* 初始化DMA */
g_dma_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */
g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */
g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */
g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */
g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */
g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */
g_dma_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */
g_dma_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */
HAL_DMA_Init(&amp;g_dma_adc_handle);

__HAL_LINKDMA(&amp;g_adc_dma_handle, DMA_Handle, g_dma_adc_handle); /* 将DMA与adc联系起来 */

g_adc_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */
g_adc_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换模式 */
g_adc_dma_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */
g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */
HAL_ADC_Init(&amp;g_adc_dma_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_dma_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_ADCX_CHY; /* 通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 序列 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc_dma_handle, &amp;adc_ch_conf); /* 通道配置 */

/* 配置DMA数据流请求中断优先级 */
HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);

HAL_DMA_Start_IT(&amp;g_dma_adc_handle, (uint32_t)&amp;ADC1->DR, mar, 0); /* 启动DMA,并开启中断 */
HAL_ADC_Start_DMA(&amp;g_adc_dma_handle, &amp;mar, 0); /* 开启ADC,通过DMA传输结果 */
}

/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/

DMA_HandleTypeDef g_dma_nch_adc_handle = {0}; /* 定义要搬运ADC多通道数据的DMA句柄 */
ADC_HandleTypeDef g_adc_nch_dma_handle = {0}; /* 定义ADC(多通道DMA读取)句柄 */

/**
* @brief ADC N通道(6通道) DMA读取 初始化函数
* @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置
* 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,
* 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.
*
* 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义
* 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.
*
* @param mar : 存储器地址
* @retval 无
*/
void adc_nch_dma_init(uint32_t mar)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/*
设置ADC1通道0~5对应的IO口模拟输入
AD采集引脚模式设置,模拟输入
PA0对应 ADC1_IN0
PA1对应 ADC1_IN1
PA2对应 ADC1_IN2
PA3对应 ADC1_IN3
PA4对应 ADC1_IN4
PA5对应 ADC1_IN5
*/
gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct);

/* 初始化DMA */
g_dma_nch_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */
g_dma_nch_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */
g_dma_nch_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */
g_dma_nch_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */
g_dma_nch_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */
g_dma_nch_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */
g_dma_nch_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */
g_dma_nch_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */
HAL_DMA_Init(&amp;g_dma_nch_adc_handle);

__HAL_LINKDMA(&amp;g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle); /* 将DMA与adc联系起来 */

/* 初始化ADC */
g_adc_nch_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_nch_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_nch_dma_handle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* 使能扫描模式 */
g_adc_nch_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */
g_adc_nch_dma_handle.Init.NbrOfConversion = 6; /* 赋值范围是1~16,本实验用到6个规则通道序列 */
g_adc_nch_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_nch_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_nch_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */
HAL_ADC_Init(&amp;g_adc_nch_dma_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_nch_dma_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 通道配置 */

adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */
// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */
// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

/* 配置DMA数据流请求中断优先级 */
HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);

HAL_DMA_Start_IT(&amp;g_dma_nch_adc_handle, (uint32_t)&amp;ADC1->DR, mar, 0); /* 启动DMA,并开启中断 */
HAL_ADC_Start_DMA(&amp;g_adc_nch_dma_handle, &amp;mar, 0); /* 开启ADC,通过DMA传输结果 */
}

/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/

/**
* @brief 使能一次ADC DMA传输
* @note 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性
* @param ndtr: DMA传输的次数
* @retval 无
*/
void adc_dma_enable(uint16_t cndtr)
{
ADC_ADCX->CR2 &amp;= ~(1 &lt;&lt; 0); /* 先关闭ADC */

ADC_ADCX_DMACx->CCR &amp;= ~(1 &lt;&lt; 0); /* 关闭DMA传输 */
while (ADC_ADCX_DMACx->CCR &amp; (1 &lt;&lt; 0)); /* 确保DMA可以被设置 */
ADC_ADCX_DMACx->CNDTR = cndtr; /* DMA传输数据量 */
ADC_ADCX_DMACx->CCR |= 1 &lt;&lt; 0; /* 开启DMA传输 */

ADC_ADCX->CR2 |= 1 &lt;&lt; 0; /* 重新启动ADC */
ADC_ADCX->CR2 |= 1 &lt;&lt; 22; /* 启动规则转换通道 */
}

/**
* @brief ADC DMA采集中断服务函数
* @param 无
* @retval 无
*/
void ADC_ADCX_DMACx_IRQHandler(void)
{
if (ADC_ADCX_DMACx_IS_TC())
{
g_adc_dma_sta = 1; /* 标记DMA传输完成 */
ADC_ADCX_DMACx_CLR_TC(); /* 清除DMA1 数据流7 传输完成中断 */
}
}

ADC_HandleTypeDef g_adc2_handle;
ADC_HandleTypeDef g_adc1_handle;
void ADC2_Init(){
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

__HAL_RCC_ADC2_CLK_ENABLE(); /* 使能ADCx时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/*
设置ADC1通道0~5对应的IO口模拟输入
AD采集引脚模式设置,模拟输入
PA0对应 ADC1_IN0
PA1对应 ADC1_IN1
PA2对应 ADC1_IN2
PA3对应 ADC1_IN3
PA4对应 ADC1_IN4
PA5对应 ADC1_IN5
*/
gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct);

/* 初始化ADC */
g_adc2_handle.Instance = ADC2; /* 选择哪个ADC */
g_adc2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc2_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 使能扫描模式 */
g_adc2_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */
g_adc2_handle.Init.NbrOfConversion = 4; /* 赋值范围是1~16,本实验用到6个规则通道序列 */
g_adc2_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc2_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */
HAL_ADC_Init(&amp;g_adc2_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc2_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 通道配置 */

adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

HAL_ADC_Start_IT(&amp;g_adc2_handle); //开启转换并触发中断
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(ADC1_2_IRQn); // 使能 ADC1 和 ADC2 的中断
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
// static uint8_t ADC2CH=0;
// if (hadc->Instance == ADC2)
// {
//
// g_adc_dma_buf&#91;ADC2CH++&#93; = HAL_ADC_GetValue(hadc);
// if(ADC2CH==4)ADC2CH=0;
//
// }
}

void ADC1_2_IRQHandler(void)
{
if (__HAL_ADC_GET_FLAG(&amp;g_adc2_handle, ADC_FLAG_EOC) != RESET)
{
HAL_ADC_IRQHandler(&amp;g_adc2_handle); // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler
}

// 检查 ADC2 是否触发了中断
if (__HAL_ADC_GET_FLAG(&amp;g_adc1_handle, ADC_FLAG_EOC) != RESET)
{
HAL_ADC_IRQHandler(&amp;g_adc1_handle); // 将 adc1 的地址传递给 HAL_ADC_IRQHandler
}
}

uint32_t ADC2_get_result(uint8_t ch)
{
adc_channel_set(&amp;g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */

HAL_ADC_Start(&amp;g_adc2_handle); /* 开启ADC */
HAL_ADC_PollForConversion(&amp;g_adc2_handle, 10); /* 轮询转换 */
return (uint16_t)HAL_ADC_GetValue(&amp;g_adc2_handle); /* 返回最近一次ADC1规则组的转换结果 */
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_handle;</span><span style="color: #768390"> /* ADC句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3</span></span>
<span class="line"><span style="color: #768390"> * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期</span></span>
<span class="line"><span style="color: #768390"> * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 非扫描模式,仅用到一个通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 关闭连续转换模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到1个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 触发转换方式:软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC底层驱动,引脚配置,时钟使能</span></span>
<span class="line"><span style="color: #768390"> 此函数会被HAL_ADC_Init()调用</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">hadc</span><span style="color: #768390">:ADC句柄</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_MspInit</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">hadc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(hadc-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> ADC_ADCX)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIO时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置AD采集通道对应IO引脚工作模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY_GPIO_PIN;</span><span style="color: #768390"> /* ADC通道IO引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(ADC_ADCX_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 设置ADC通道采样时间</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">adcx</span><span style="color: #768390"> : adc句柄指针,ADC_HandleTypeDef</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390"> : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">stime</span><span style="color: #768390">: 采样时间 0~7, 对应关系为:</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">rank</span><span style="color: #768390">: 多通道采集时需要设置的采集编号,</span></span>
<span class="line"><span style="color: #768390"> 假设你定义channle1的rank=1,channle2 的rank=2,</span></span>
<span class="line"><span style="color: #768390"> 那么对应你在DMA缓存空间的变量数组AdcDMA&#91;0&#93; 就i是channle1的转换结果,AdcDMA&#91;1&#93;就是通道2的转换结果。 </span></span>
<span class="line"><span style="color: #768390"> 单通道DMA设置为 ADC_REGULAR_RANK_1</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">adc_handle</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">rank</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">stime</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ch;</span><span style="color: #768390"> /* 通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> rank;</span><span style="color: #768390"> /* 序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> stime;</span><span style="color: #768390"> /* 采样时间 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(adc_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 获得ADC转换后的结果</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390">: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);</span><span style="color: #768390"> /* 设置通道,序列和采样时间 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 开启ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_PollForConversion</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle, </span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 轮询转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7">)</span><span style="color: #DCBDFB">HAL_ADC_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 返回最近一次ADC1规则组的转换结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 获取通道ch的转换值,取times次,然后平均</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390"> : 通道号, 0~17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">times</span><span style="color: #768390"> : 获取次数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 通道ch的times次转换结果平均值</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result_average</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">times</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> t;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">for</span><span style="color: #ADBAC7"> (t </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">; t </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> times; t</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 获取times次数据 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(ch);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">/</span><span style="color: #ADBAC7"> times;</span><span style="color: #768390"> /* 返回平均值 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">DMA_HandleTypeDef g_dma_adc_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义要搬运ADC数据的DMA句柄 */</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_dma_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义ADC(DMA读取)句柄 */</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> g_adc_dma_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* DMA传输状态标志, 0,未完成; 1, 已完成 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC DMA读取 初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">par</span><span style="color: #768390"> : 外设地址</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">mar</span><span style="color: #768390"> : 存储器地址</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIO时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置AD采集通道对应IO引脚工作模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY_GPIO_PIN;</span><span style="color: #768390"> /* ADC通道对应的IO引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(ADC_ADCX_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化DMA */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_DMACx;</span><span style="color: #768390"> /* 设置DMA通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Direction </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PERIPH_TO_MEMORY;</span><span style="color: #768390"> /* 从外设到存储器模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.PeriphInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PINC_DISABLE;</span><span style="color: #768390"> /* 外设非增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.MemInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MINC_ENABLE;</span><span style="color: #768390"> /* 存储器增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.PeriphDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 外设数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.MemDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 存储器数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_NORMAL;</span><span style="color: #768390"> /* 外设流控模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Priority </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PRIORITY_MEDIUM;</span><span style="color: #768390"> /* 中等优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_adc_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_LINKDMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, DMA_Handle, g_dma_adc_handle);</span><span style="color: #768390"> /* 将DMA与adc联系起来 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 非扫描模式,仅用到一个通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到1个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 触发转换方式:软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY;</span><span style="color: #768390"> /* 通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置DMA数据流请求中断优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_adc_handle, (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">ADC1-&gt;DR, mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 启动DMA,并开启中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_DMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 开启ADC,通过DMA传输结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">DMA_HandleTypeDef g_dma_nch_adc_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义要搬运ADC多通道数据的DMA句柄 */</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_nch_dma_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义ADC(多通道DMA读取)句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC N通道(6通道) DMA读取 初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置</span></span>
<span class="line"><span style="color: #768390"> * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,</span></span>
<span class="line"><span style="color: #768390"> * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义</span></span>
<span class="line"><span style="color: #768390"> * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">mar</span><span style="color: #768390"> : 存储器地址 </span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_nch_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIOA时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* </span></span>
<span class="line"><span style="color: #768390"> 设置ADC1通道0~5对应的IO口模拟输入</span></span>
<span class="line"><span style="color: #768390"> AD采集引脚模式设置,模拟输入</span></span>
<span class="line"><span style="color: #768390"> PA0对应 ADC1_IN0</span></span>
<span class="line"><span style="color: #768390"> PA1对应 ADC1_IN1</span></span>
<span class="line"><span style="color: #768390"> PA2对应 ADC1_IN2</span></span>
<span class="line"><span style="color: #768390"> PA3对应 ADC1_IN3</span></span>
<span class="line"><span style="color: #768390"> PA4对应 ADC1_IN4</span></span>
<span class="line"><span style="color: #768390"> PA5对应 ADC1_IN5</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_0</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_1</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_2</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_3</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_4</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_5;</span><span style="color: #768390"> /* GPIOA0~5 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化DMA */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_DMACx;</span><span style="color: #768390"> /* 设置DMA通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Direction </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PERIPH_TO_MEMORY;</span><span style="color: #768390"> /* 从外设到存储器模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.PeriphInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PINC_DISABLE;</span><span style="color: #768390"> /* 外设非增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.MemInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MINC_ENABLE;</span><span style="color: #768390"> /* 存储器增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.PeriphDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 外设数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.MemDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 存储器数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_NORMAL;</span><span style="color: #768390"> /* 外设流控模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Priority </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PRIORITY_MEDIUM;</span><span style="color: #768390"> /* 中等优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_nch_adc_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_LINKDMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle);</span><span style="color: #768390"> /* 将DMA与adc联系起来 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_ENABLE;</span><span style="color: #768390"> /* 使能扫描模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">6</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到6个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_2;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 采样序列里的第1个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_3;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_2;</span><span style="color: #768390"> /* 采样序列里的第2个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_4;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_3;</span><span style="color: #768390"> /* 采样序列里的第3个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_5;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_4;</span><span style="color: #768390"> /* 采样序列里的第4个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */</span></span>
<span class="line"><span style="color: #768390">// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */</span></span>
<span class="line"><span style="color: #768390">// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置DMA数据流请求中断优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_nch_adc_handle, (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">ADC1-&gt;DR, mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 启动DMA,并开启中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_DMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 开启ADC,通过DMA传输结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 使能一次ADC DMA传输</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ndtr</span><span style="color: #768390">: DMA传输的次数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">cndtr</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">&amp;=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">~</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 先关闭ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">&amp;=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">~</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 关闭DMA传输 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">));</span><span style="color: #768390"> /* 确保DMA可以被设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CNDTR </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> cndtr;</span><span style="color: #768390"> /* DMA传输数据量 */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 开启DMA传输 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 重新启动ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">22</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 启动规则转换通道 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC DMA采集中断服务函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span><span style="color: #768390"> </span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IS_TC</span><span style="color: #ADBAC7">())</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 标记DMA传输完成 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_CLR_TC</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 清除DMA1 数据流7 传输完成中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc2_handle;</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc1_handle;</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_Init</span><span style="color: #ADBAC7">(){</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_ADC2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIOA时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* </span></span>
<span class="line"><span style="color: #768390"> 设置ADC1通道0~5对应的IO口模拟输入</span></span>
<span class="line"><span style="color: #768390"> AD采集引脚模式设置,模拟输入</span></span>
<span class="line"><span style="color: #768390"> PA0对应 ADC1_IN0</span></span>
<span class="line"><span style="color: #768390"> PA1对应 ADC1_IN1</span></span>
<span class="line"><span style="color: #768390"> PA2对应 ADC1_IN2</span></span>
<span class="line"><span style="color: #768390"> PA3对应 ADC1_IN3</span></span>
<span class="line"><span style="color: #768390"> PA4对应 ADC1_IN4</span></span>
<span class="line"><span style="color: #768390"> PA5对应 ADC1_IN5</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_0</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_1</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_2</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_3</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_4</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_5;</span><span style="color: #768390"> /* GPIOA0~5 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC2;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 使能扫描模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到6个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_2;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 采样序列里的第1个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_3;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_2;</span><span style="color: #768390"> /* 采样序列里的第2个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_4;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_3;</span><span style="color: #768390"> /* 采样序列里的第3个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_5;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_4;</span><span style="color: #768390"> /* 采样序列里的第4个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> //开启转换并触发中断</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC1_2_IRQn, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> // 设置中断优先级</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC1_2_IRQn);</span><span style="color: #768390"> // 使能 ADC1 和 ADC2 的中断</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConvCpltCallback</span><span style="color: #ADBAC7">(ADC_HandleTypeDef</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">hadc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390">// static uint8_t ADC2CH=0;</span></span>
<span class="line"><span style="color: #768390">// if (hadc-&gt;Instance == ADC2)</span></span>
<span class="line"><span style="color: #768390">// {</span></span>
<span class="line"><span style="color: #768390">// </span></span>
<span class="line"><span style="color: #768390">// g_adc_dma_buf&#91;ADC2CH++&#93; = HAL_ADC_GetValue(hadc);</span></span>
<span class="line"><span style="color: #768390">// if(ADC2CH==4)ADC2CH=0;</span></span>
<span class="line"><span style="color: #768390">// </span></span>
<span class="line"><span style="color: #768390">// }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC1_2_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">__HAL_ADC_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, ADC_FLAG_EOC) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">// 检查 ADC2 是否触发了中断</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">__HAL_ADC_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc1_handle, ADC_FLAG_EOC) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc1_handle);</span><span style="color: #768390"> // 将 adc1 的地址传递给 HAL_ADC_IRQHandler</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);</span><span style="color: #768390"> /* 设置通道,序列和采样时间 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 开启ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_PollForConversion</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 轮询转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7">)</span><span style="color: #DCBDFB">HAL_ADC_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 返回最近一次ADC1规则组的转换结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="bETty">电机驱动和PWM(TIM2)</h3>
<!-- /wp:heading -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"#ifndef __MOTOR_H\n#define __MOTOR_H\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\nvoid Motor_Init(void);\nvoid Motor_SetPWM(int16_t Speed);\nvoid PWM_Init();\nvoid PWM_SetCompare1(uint16_t Compare);\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__MOTOR_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__MOTOR_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eSpeed\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_SetCompare1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eCompare\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":10,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef __MOTOR_H
#define __MOTOR_H
#include "./SYSTEM/sys/sys.h"
#include "./BSP/TIMER/gtim.h"
void Motor_Init(void);
void Motor_SetPWM(int16_t Speed);
void PWM_Init();
void PWM_SetCompare1(uint16_t Compare);
#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__MOTOR_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__MOTOR_H</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">Speed</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_SetCompare1</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">Compare</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#include \u0022./SYSTEM/sys/sys.h\u0022\n//#include \u0022PWM.h\u0022\n\n#include \u0022./BSP/Motor/Motor.h\u0022\n/**\n * 函 数:直流电机初始化\n * 参 数:无\n * 返 回 值:无\n */\nvoid Motor_Init(void)\n{\n\n GPIO_InitTypeDef gpio_init_struct;\n __HAL_RCC_GPIOB_CLK_ENABLE();\n\n gpio_init_struct.Pin = GPIO_PIN_13; /* 引脚 */\n gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */\n gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n HAL_GPIO_Init(GPIOB, \u0026gpio_init_struct); /* 初始化引脚 */\n\n gpio_init_struct.Pin = GPIO_PIN_12; /* 引脚 */\n HAL_GPIO_Init(GPIOB, \u0026gpio_init_struct); /* 初始化引脚 */\n PWM_Init(); //初始化直流电机的底层PWM\n\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET); //PA4置高电平\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET); //PA5置低电平,设置方向为正转\n}\n\n/**\n * 函 数:直流电机设置速度\n * 参 数:Speed 要设置的速度,范围:-100~100\n * 返 回 值:无\n */\nvoid Motor_SetPWM(int16_t Speed)\n{\n\n if (Speed \u003e= 0) //如果设置正转的速度值\n { \n if(Speed\u003e1000)Speed=1000;\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET); //PA4置高电平\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET); //PA5置低电平,设置方向为正转\n PWM_SetCompare1(Speed); //PWM设置为速度值\n }\n else //否则,即设置反转的速度值\n { \n if(Speed\u003c-1000)Speed=-1000;\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET); //PA4置低电平\n HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_SET); //PA5置高电平,设置方向为反转\n PWM_SetCompare1(-Speed); //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数\n }\n}\n\nvoid PWM_Init(){\n gtim_timx_pwm_chy_init(1000-1,36-1);\n}\n\nvoid PWM_SetCompare1(uint16_t Compare){\n __HAL_TIM_SET_COMPARE(\u0026g_timx_pwm_chy_handle,GTIM_TIMX_PWM_CHY,Compare);\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;PWM.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 函 数:直流电机初始化\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 参 数:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 返 回 值:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOB_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_13;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_OUTPUT_PP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 推挽输出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLUP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_12;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //初始化直流电机的底层PWM\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_12,GPIO_PIN_SET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA4置高电平\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA5置低电平,设置方向为正转\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 函 数:直流电机设置速度\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 参 数:Speed 要设置的速度,范围:-100~100\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 返 回 值:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eSpeed\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //如果设置正转的速度值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e { \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)Speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_12,GPIO_PIN_SET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA4置高电平\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA5置低电平,设置方向为正转\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_SetCompare1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Speed);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PWM设置为速度值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //否则,即设置反转的速度值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e { \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)Speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA4置低电平\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOB, GPIO_PIN_13,GPIO_PIN_SET);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PA5置高电平,设置方向为反转\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_SetCompare1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeed);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_timx_pwm_chy_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e36\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePWM_SetCompare1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eCompare\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_SET_COMPARE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_pwm_chy_handle,GTIM_TIMX_PWM_CHY,Compare);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":60,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include "./SYSTEM/sys/sys.h"
//#include "PWM.h"

#include "./BSP/Motor/Motor.h"
/**
* 函 数:直流电机初始化
* 参 数:无
* 返 回 值:无
*/
void Motor_Init(void)
{

GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE();

gpio_init_struct.Pin = GPIO_PIN_13; /* 引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOB, &amp;gpio_init_struct); /* 初始化引脚 */

gpio_init_struct.Pin = GPIO_PIN_12; /* 引脚 */
HAL_GPIO_Init(GPIOB, &amp;gpio_init_struct); /* 初始化引脚 */
PWM_Init(); //初始化直流电机的底层PWM

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET); //PA4置高电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET); //PA5置低电平,设置方向为正转
}

/**
* 函 数:直流电机设置速度
* 参 数:Speed 要设置的速度,范围:-100~100
* 返 回 值:无
*/
void Motor_SetPWM(int16_t Speed)
{

if (Speed >= 0) //如果设置正转的速度值
{
if(Speed>1000)Speed=1000;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET); //PA4置高电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET); //PA5置低电平,设置方向为正转
PWM_SetCompare1(Speed); //PWM设置为速度值
}
else //否则,即设置反转的速度值
{
if(Speed&lt;-1000)Speed=-1000;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET); //PA4置低电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13,GPIO_PIN_SET); //PA5置高电平,设置方向为反转
PWM_SetCompare1(-Speed); //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数
}
}

void PWM_Init(){
gtim_timx_pwm_chy_init(1000-1,36-1);
}

void PWM_SetCompare1(uint16_t Compare){
__HAL_TIM_SET_COMPARE(&amp;g_timx_pwm_chy_handle,GTIM_TIMX_PWM_CHY,Compare);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;PWM.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * 函 数:直流电机初始化</span></span>
<span class="line"><span style="color: #768390"> * 参 数:无</span></span>
<span class="line"><span style="color: #768390"> * 返 回 值:无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_13;</span><span style="color: #768390"> /* 引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_OUTPUT_PP;</span><span style="color: #768390"> /* 推挽输出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLUP;</span><span style="color: #768390"> /* 上拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOB, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* 初始化引脚 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_12;</span><span style="color: #768390"> /* 引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOB, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* 初始化引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_Init</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> //初始化直流电机的底层PWM</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_12,GPIO_PIN_SET);</span><span style="color: #768390"> //PA4置高电平</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET);</span><span style="color: #768390"> //PA5置低电平,设置方向为正转</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * 函 数:直流电机设置速度</span></span>
<span class="line"><span style="color: #768390"> * 参 数:Speed 要设置的速度,范围:-100~100</span></span>
<span class="line"><span style="color: #768390"> * 返 回 值:无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">Speed</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (Speed </span><span style="color: #F47067">&gt;=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> //如果设置正转的速度值</span></span>
<span class="line"><span style="color: #ADBAC7"> { </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Speed</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">)Speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_12,GPIO_PIN_SET);</span><span style="color: #768390"> //PA4置高电平</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_13,GPIO_PIN_RESET);</span><span style="color: #768390"> //PA5置低电平,设置方向为正转</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_SetCompare1</span><span style="color: #ADBAC7">(Speed);</span><span style="color: #768390"> //PWM设置为速度值</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span><span style="color: #768390"> //否则,即设置反转的速度值</span></span>
<span class="line"><span style="color: #ADBAC7"> { </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Speed</span><span style="color: #F47067">&lt;-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">)Speed</span><span style="color: #F47067">=-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET);</span><span style="color: #768390"> //PA4置低电平</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_WritePin</span><span style="color: #ADBAC7">(GPIOB, GPIO_PIN_13,GPIO_PIN_SET);</span><span style="color: #768390"> //PA5置高电平,设置方向为反转</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_SetCompare1</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">Speed);</span><span style="color: #768390"> //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_Init</span><span style="color: #ADBAC7">(){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_timx_pwm_chy_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">36</span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PWM_SetCompare1</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">Compare</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_SET_COMPARE</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_pwm_chy_handle,GTIM_TIMX_PWM_CHY,Compare);</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"\n\n#ifndef __GTIM_H\n#define __GTIM_H\n\n#include \u0022./SYSTEM/sys/sys.h\u0022\n\n/******************************************************************************************/\n/* 通用定时器 定义 */\n\n/* TIMX 中断定义 \n * 默认是针对TIM2~TIM5.\n * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM17任意一个定时器.\n */\n\n#define GTIM_TIMX_INT TIM3\n#define GTIM_TIMX_INT_IRQn TIM3_IRQn\n#define GTIM_TIMX_INT_IRQHandler TIM3_IRQHandler\n#define GTIM_TIMX_INT_CLK_ENABLE() do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0) /* TIM3 时钟使能 */\n\n/* TIMX PWM输出定义 \n * 这里输出的PWM控制LED0(RED)的亮度\n * 默认是针对TIM2~TIM5\n * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口输出PWM\n */\n#define GTIM_TIMX_PWM_CHY_GPIO_PORT GPIOA\n#define GTIM_TIMX_PWM_CHY_GPIO_PIN GPIO_PIN_0\n#define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PB口时钟使能 */\n\n/* TIMX REMAP设置\n * 因为我们LED0接在PB5上, 必须通过开启TIM3的部分重映射功能, 才能将TIM3_CH2输出到PB5上\n * 因此, 必须实现GTIM_TIMX_PWM_CHY_GPIO_REMAP\n * 对那些使用默认设置的定时器PWM输出脚, 不用设置重映射, 是不需要该函数的!\n * 具体用哪个函数、用不用重映射,查看stm32f1xx_hal_gpio_ex.h,搜__HAL_AFIO_REMAP_TIM3_PARTIAL,看相关系列函数\n */\n#define GTIM_TIMX_PWM_CHY_GPIO_REMAP() do{__HAL_RCC_AFIO_CLK_ENABLE();\n __HAL_AFIO_REMAP_TIM2_DISABLE();\n }while(0) /* 通道REMAP设置, 该函数不是必须的, 根据需要实现 */\n\n#define GTIM_TIMX_PWM TIM2 \n#define GTIM_TIMX_PWM_CHY TIM_CHANNEL_1 /* 通道Y, 1\u0026lt;= Y \u0026lt;=4 */\n#define GTIM_TIMX_PWM_CHY_CCRX TIM2-\u003eCCR1 /* 通道Y的输出比较寄存器 */\n#define GTIM_TIMX_PWM_CHY_CLK_ENABLE() do{ __HAL_RCC_TIM2_CLK_ENABLE(); }while(0) /* TIM3 时钟使能 */\n\n/*********************************以下是通用定时器输入捕获实验相关宏定义*************************************/\n\n /* TIMX 输入捕获定义 \n * 这里的输入捕获使用定时器TIM5_CH1,捕获WK_UP按键的输入\n * 默认是针对TIM2~TIM5. \n * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口做输入捕获\n * 特别要注意:默认用的PA0,设置的是下拉输入!如果改其他IO,对应的上下拉方式也得改!\n */\n#define GTIM_TIMX_CAP_CHY_GPIO_PORT GPIOB\n#define GTIM_TIMX_CAP_CHY_GPIO_PIN GPIO_PIN_6\n#define GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0) /* PD口时钟使能 */\n\n#define GTIM_TIMX_CAP TIM4 \n#define GTIM_TIMX_CAP_IRQn TIM4_IRQn\n#define GTIM_TIMX_CAP_IRQHandler TIM4_IRQHandler\n#define GTIM_TIMX_CAP_CHY TIM_CHANNEL_1 /* 通道Y, 1\u0026lt;= Y \u0026lt;=4 */\n#define GTIM_TIMX_CAP_CHY_CCRX TIM4-\u003eCCR1 /* 通道Y的输出比较寄存器 */\n#define GTIM_TIMX_CAP_CHY_CLK_ENABLE() do{ __HAL_RCC_TIM4_CLK_ENABLE();\n /*__HAL_AFIO_REMAP_TIM4_ENABLE();*/\n }while(0) /* TIM5 时钟使能 */\n\n/******************************************************************************************/\nextern uint8_t g_timxchy_cap_sta; /* 输入捕获状态 */\nextern uint16_t g_timxchy_cap_val; /* 输入捕获值 */\nextern TIM_HandleTypeDef g_timx_pwm_chy_handle; /* 定时器x句柄 */\n\nvoid gtim_tim3_int_init(uint16_t arr, uint16_t psc); /* 通用定时器 定时中断初始化函数 */\nvoid gtim_tim2_int_init(uint16_t arr, uint16_t psc);\nvoid gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc); /* 通用定时器 PWM初始化函数 */\nvoid gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc); /* 通用定时器 输入捕获初始化函数 */\n\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__GTIM_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__GTIM_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 通用定时器 定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* TIMX 中断定义 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 默认是针对TIM2~TIM5.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM17任意一个定时器.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_INT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_INT_IRQn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM3_IRQn\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_INT_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM3_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_INT_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM3_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* TIM3 时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* TIMX PWM输出定义 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 这里输出的PWM控制LED0(RED)的亮度\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 默认是针对TIM2~TIM5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口输出PWM\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOA\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PB口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* TIMX REMAP设置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 因为我们LED0接在PB5上, 必须通过开启TIM3的部分重映射功能, 才能将TIM3_CH2输出到PB5上\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 因此, 必须实现GTIM_TIMX_PWM_CHY_GPIO_REMAP\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 对那些使用默认设置的定时器PWM输出脚, 不用设置重映射, 是不需要该函数的!\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 具体用哪个函数、用不用重映射,查看stm32f1xx_hal_gpio_ex.h,搜__HAL_AFIO_REMAP_TIM3_PARTIAL,看相关系列函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_REMAP\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_AFIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_AFIO_REMAP_TIM2_DISABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道REMAP设置, 该函数不是必须的, 根据需要实现 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM2 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_CHANNEL_1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y, 1\u0026lt;= Y \u0026lt;=4 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_CCRX\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM2-\u0026gt;CCR1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y的输出比较寄存器 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* TIM3 时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*********************************以下是通用定时器输入捕获实验相关宏定义*************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* TIMX 输入捕获定义 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 这里的输入捕获使用定时器TIM5_CH1,捕获WK_UP按键的输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 默认是针对TIM2~TIM5. \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口做输入捕获\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 特别要注意:默认用的PA0,设置的是下拉输入!如果改其他IO,对应的上下拉方式也得改!\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOB\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_6\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOD_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PD口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM4 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_IRQn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM4_IRQn\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM4_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_CHANNEL_1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y, 1\u0026lt;= Y \u0026lt;=4 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_CCRX\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM4-\u0026gt;CCR1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y的输出比较寄存器 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM4_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*__HAL_AFIO_REMAP_TIM4_ENABLE();*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* TIM5 时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eextern\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入捕获状态 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eextern\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_val;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入捕获值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eextern\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_HandleTypeDef g_timx_pwm_chy_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器x句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_tim3_int_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器 定时中断初始化函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_tim2_int_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_timx_pwm_chy_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器 PWM初始化函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_timx_cap_chy_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器 输入捕获初始化函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":77,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>

#ifndef __GTIM_H
#define __GTIM_H

#include "./SYSTEM/sys/sys.h"

/******************************************************************************************/
/* 通用定时器 定义 */

/* TIMX 中断定义
* 默认是针对TIM2~TIM5.
* 注意: 通过修改这4个宏定义,可以支持TIM1~TIM17任意一个定时器.
*/

#define GTIM_TIMX_INT TIM3
#define GTIM_TIMX_INT_IRQn TIM3_IRQn
#define GTIM_TIMX_INT_IRQHandler TIM3_IRQHandler
#define GTIM_TIMX_INT_CLK_ENABLE() do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0) /* TIM3 时钟使能 */

/* TIMX PWM输出定义
* 这里输出的PWM控制LED0(RED)的亮度
* 默认是针对TIM2~TIM5
* 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口输出PWM
*/
#define GTIM_TIMX_PWM_CHY_GPIO_PORT GPIOA
#define GTIM_TIMX_PWM_CHY_GPIO_PIN GPIO_PIN_0
#define GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PB口时钟使能 */

/* TIMX REMAP设置
* 因为我们LED0接在PB5上, 必须通过开启TIM3的部分重映射功能, 才能将TIM3_CH2输出到PB5上
* 因此, 必须实现GTIM_TIMX_PWM_CHY_GPIO_REMAP
* 对那些使用默认设置的定时器PWM输出脚, 不用设置重映射, 是不需要该函数的!
* 具体用哪个函数、用不用重映射,查看stm32f1xx_hal_gpio_ex.h,搜__HAL_AFIO_REMAP_TIM3_PARTIAL,看相关系列函数
*/
#define GTIM_TIMX_PWM_CHY_GPIO_REMAP() do{__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_TIM2_DISABLE();
}while(0) /* 通道REMAP设置, 该函数不是必须的, 根据需要实现 */

#define GTIM_TIMX_PWM TIM2
#define GTIM_TIMX_PWM_CHY TIM_CHANNEL_1 /* 通道Y, 1&lt;= Y &lt;=4 */
#define GTIM_TIMX_PWM_CHY_CCRX TIM2->CCR1 /* 通道Y的输出比较寄存器 */
#define GTIM_TIMX_PWM_CHY_CLK_ENABLE() do{ __HAL_RCC_TIM2_CLK_ENABLE(); }while(0) /* TIM3 时钟使能 */

/*********************************以下是通用定时器输入捕获实验相关宏定义*************************************/

/* TIMX 输入捕获定义
* 这里的输入捕获使用定时器TIM5_CH1,捕获WK_UP按键的输入
* 默认是针对TIM2~TIM5.
* 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口做输入捕获
* 特别要注意:默认用的PA0,设置的是下拉输入!如果改其他IO,对应的上下拉方式也得改!
*/
#define GTIM_TIMX_CAP_CHY_GPIO_PORT GPIOB
#define GTIM_TIMX_CAP_CHY_GPIO_PIN GPIO_PIN_6
#define GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0) /* PD口时钟使能 */

#define GTIM_TIMX_CAP TIM4
#define GTIM_TIMX_CAP_IRQn TIM4_IRQn
#define GTIM_TIMX_CAP_IRQHandler TIM4_IRQHandler
#define GTIM_TIMX_CAP_CHY TIM_CHANNEL_1 /* 通道Y, 1&lt;= Y &lt;=4 */
#define GTIM_TIMX_CAP_CHY_CCRX TIM4->CCR1 /* 通道Y的输出比较寄存器 */
#define GTIM_TIMX_CAP_CHY_CLK_ENABLE() do{ __HAL_RCC_TIM4_CLK_ENABLE();
/*__HAL_AFIO_REMAP_TIM4_ENABLE();*/
}while(0) /* TIM5 时钟使能 */

/******************************************************************************************/
extern uint8_t g_timxchy_cap_sta; /* 输入捕获状态 */
extern uint16_t g_timxchy_cap_val; /* 输入捕获值 */
extern TIM_HandleTypeDef g_timx_pwm_chy_handle; /* 定时器x句柄 */

void gtim_tim3_int_init(uint16_t arr, uint16_t psc); /* 通用定时器 定时中断初始化函数 */
void gtim_tim2_int_init(uint16_t arr, uint16_t psc);
void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc); /* 通用定时器 PWM初始化函数 */
void gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc); /* 通用定时器 输入捕获初始化函数 */

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__GTIM_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__GTIM_H</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* 通用定时器 定义 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* TIMX 中断定义 </span></span>
<span class="line"><span style="color: #768390"> * 默认是针对TIM2~TIM5.</span></span>
<span class="line"><span style="color: #768390"> * 注意: 通过修改这4个宏定义,可以支持TIM1~TIM17任意一个定时器.</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_INT</span><span style="color: #ADBAC7"> TIM3</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_INT_IRQn</span><span style="color: #ADBAC7"> TIM3_IRQn</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_INT_IRQHandler</span><span style="color: #ADBAC7"> TIM3_IRQHandler</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_INT_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_TIM3_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* TIM3 时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* TIMX PWM输出定义 </span></span>
<span class="line"><span style="color: #768390"> * 这里输出的PWM控制LED0(RED)的亮度</span></span>
<span class="line"><span style="color: #768390"> * 默认是针对TIM2~TIM5</span></span>
<span class="line"><span style="color: #768390"> * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口输出PWM</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOA</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_0</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PB口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* TIMX REMAP设置</span></span>
<span class="line"><span style="color: #768390"> * 因为我们LED0接在PB5上, 必须通过开启TIM3的部分重映射功能, 才能将TIM3_CH2输出到PB5上</span></span>
<span class="line"><span style="color: #768390"> * 因此, 必须实现GTIM_TIMX_PWM_CHY_GPIO_REMAP</span></span>
<span class="line"><span style="color: #768390"> * 对那些使用默认设置的定时器PWM输出脚, 不用设置重映射, 是不需要该函数的!</span></span>
<span class="line"><span style="color: #768390"> * 具体用哪个函数、用不用重映射,查看stm32f1xx_hal_gpio_ex.h,搜__HAL_AFIO_REMAP_TIM3_PARTIAL,看相关系列函数</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_REMAP</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{</span><span style="color: #DCBDFB">__HAL_RCC_AFIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_AFIO_REMAP_TIM2_DISABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 通道REMAP设置, 该函数不是必须的, 根据需要实现 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM</span><span style="color: #ADBAC7"> TIM2 </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY</span><span style="color: #ADBAC7"> TIM_CHANNEL_1</span><span style="color: #768390"> /* 通道Y, 1&lt;= Y &lt;=4 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_CCRX</span><span style="color: #ADBAC7"> TIM2-&gt;CCR1</span><span style="color: #768390"> /* 通道Y的输出比较寄存器 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_TIM2_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* TIM3 时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*********************************以下是通用定时器输入捕获实验相关宏定义*************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* TIMX 输入捕获定义 </span></span>
<span class="line"><span style="color: #768390"> * 这里的输入捕获使用定时器TIM5_CH1,捕获WK_UP按键的输入</span></span>
<span class="line"><span style="color: #768390"> * 默认是针对TIM2~TIM5. </span></span>
<span class="line"><span style="color: #768390"> * 注意: 通过修改这几个宏定义,可以支持TIM1~TIM8任意一个定时器,任意一个IO口做输入捕获</span></span>
<span class="line"><span style="color: #768390"> * 特别要注意:默认用的PA0,设置的是下拉输入!如果改其他IO,对应的上下拉方式也得改!</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOB</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_6</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOD_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PD口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP</span><span style="color: #ADBAC7"> TIM4 </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_IRQn</span><span style="color: #ADBAC7"> TIM4_IRQn</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_IRQHandler</span><span style="color: #ADBAC7"> TIM4_IRQHandler</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY</span><span style="color: #ADBAC7"> TIM_CHANNEL_1</span><span style="color: #768390"> /* 通道Y, 1&lt;= Y &lt;=4 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_CCRX</span><span style="color: #ADBAC7"> TIM4-&gt;CCR1</span><span style="color: #768390"> /* 通道Y的输出比较寄存器 */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_TIM4_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #768390"> /*__HAL_AFIO_REMAP_TIM4_ENABLE();*/</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* TIM5 时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #F47067">extern</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> g_timxchy_cap_sta;</span><span style="color: #768390"> /* 输入捕获状态 */</span></span>
<span class="line"><span style="color: #F47067">extern</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> g_timxchy_cap_val;</span><span style="color: #768390"> /* 输入捕获值 */</span></span>
<span class="line"><span style="color: #F47067">extern</span><span style="color: #ADBAC7"> TIM_HandleTypeDef g_timx_pwm_chy_handle;</span><span style="color: #768390"> /* 定时器x句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_tim3_int_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 通用定时器 定时中断初始化函数 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_tim2_int_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_timx_pwm_chy_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 通用定时器 PWM初始化函数 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_timx_cap_chy_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 通用定时器 输入捕获初始化函数 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d基本介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\n\n/*\n通用定时器:TIM2、3、4、5\n 和基本定时器相比,通用定时器的计数器允许递增、递减、中心对齐三种计数模式;\n 用途上不仅可以触发DAC(数模转换),还可以触发ADC(模数转换);\n 中断条件上,除了更新事件外还有触发事件、输入捕获、输出比较\n\n 额外拥有4个独立通道,可用于输入捕获、输出比较、PMW输出、单脉冲模式\n\n 可以用外部信号控制定时器,可以实现多个定时器互联的同步电路(级联,即用某个定时器的溢出事件来作为下一个定时器的时钟信号)\n\n 支持编码器和霍尔传感器电路\n\n 时钟源可以来自于:系统总线(APB,即内部时钟)、内部触发输入时钟(来自鱼其它定时器的控制器等)、IO引脚复用为定时器ETR引脚(外部时钟模式二)、本定时器通道一、通道二(外部时钟模式一)\n IO引脚复用查看STM32F103ZET6.pdf,搜索ETR即可。搜到的第二个TIM8_ETR就是,前面的PA0-WKUP就是引脚名称,在前面的数字即使引脚编号,查看自己芯片的封装类别即可。\n 通道同理,搜CH1和CH2即可。\n\n 控制器:可以接入其它定时器的内部触发输入,也可以到DAC/ADC。\n\n 输入捕获、捕获/比较、输出比较:以CH1通道为例\n 外部信号-\u003eIO引脚-\u003e(滤波器、边沿检测器)-\u003e产生捕获信号到捕获寄存器1或者2(除了事件外还可以产生中断,只不过中断需要配置)-\u003e\n 将计数器当前值转移到捕获/比较影子寄存器,输入模式下再转移到捕获/比较预装载寄存器用于程序读取,输出模式下将捕获/比较预装载寄存器值转移到其影子寄存器(缓冲)-\u003e与计数器值比较-\u003e若相等-\u003e\n 改变输出信号(输出信号高电平有效),并产生比较事件(如果配置了还会产生中断)-\u003e\n 信号传到输出控制模块-\u003e输出控制模块产生输出信号到本通道输出引脚。\n 注:输出引脚和输入引脚是同一引脚,它们是分时复用的关系,同时只有一边有效。\n\n*/\n\n/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d时钟源介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\n/*\n 内部时钟,设置 TIMx_SMCR 的 SMS=0000,与基本定时器一样,时钟源来自系统总线(APB)时钟,预分频器大于2时会*2 。\n 外部时钟模式一,设置 TIMx_SMCR 的 SMS=1111,来自外部输入引脚(TIx),一共有三种信号:\n 当时钟源来自边沿检测器前的信号(TI1F_ED信号),时钟源信号是一个双边沿检测信号,不论是上升沿还是下降沿都会触发计数器的计数,注意这个信号只对通道1有效。\n 来自于边沿检测器后的信号(TI1FP1、TI2FP2信号),是一个单边沿检测信号,根据配置决定上升沿还是下降沿,对通道1和2都有效。\n 这三种信号都可以设置是否滤波(TIMx_CCMR1的IC1F位),以及滤波器滤波的频率(TIMx_CR1的CDK位)。\n 数字滤波器的详细说明:在设置好工作频率后,还会设置采样次数(N),只有在采样器以工作频率连续采样到N个与当前输出值不同的输入信号时,才会更新输出值,当 8 次采样中有高有低,那就保持原来的输出。\n 比如N等于8,原本输出低电平,第一次采样信号为高电平,第二次采样为低电平,但此时输出仍是低电平,且这8次采样的结果不会计入下一轮采样;只有当9~16次采样信号全部都是高电平时输出才会是高电平。\n 外部时钟模式2,设置 TIMx_SMCR 的 ECE=1,来自外部触发输入(TIMx_ETR);\n 内部触发输入,来自其它定时器的控制器(TIRx,x=0、1、2、3)。设置方式参考F10XXX参考手册的定时器同步章节,各个TIR信号编码查看从模式控制寄存器(TIMx_SMCR)的TS位,关于每个定时器中ITRx的细节,参见参考手册的表78。\n*/\n\n/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d输出比较部分介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\n/*\n 捕获/比较预装载寄存器何时会将值装在到其影子寄存器里(三个条件必须同时满足):\n 当CCR1寄存器未处于被操作状态时;\n 当通道被配置未输出时;\n 该寄存器没有配置缓冲使能或定时器产生更新事件时。\n\n 捕获/比较通道的输出部分(以通道1为例):\n 寄存器将比较结果传到输出控制模块,输出控制模块根据配置(CCMR1的OC1M位)产生输出信号(OC1REF信号,高电平有效),这个信号再根据配置(CCER的CC1P位)决定是否反转,并输出到IO引脚(OC1信号)。\n\n 输出PWM原理:\n 当计数器的值大于等于捕获/比较寄存器(CRR)的值时,输出逻辑为1,否则为0。\n 那么我们通过设置计数周期以及重装载寄存器(ARR)的值就可以产生一个我们需要的波形。\n ARR越大,周期越大、频率越小;CRR则与占空比相关,具体看计数器的计数方式。\n\n*/ \n\n/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002dPWM模式介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\n/*\n PWM有两种模式。\n PWM模式一:CNT\u003cCCR1是为有效电平(OC1REF=1),CNT\u003e=CR1是为无效电平(OC1REF=0)。\n PWM模式二:与模式一相反。\n\n*/\n\n/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d-输入捕获测量脉宽信号原理\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d-*/\n/*\n简单来说就是通过两次捕获事件时计数器值之差,再加上这段时间内溢出事件的次数,就可以计算两次捕获事件的间隔时间。\n\n具体过程:捕获到一个沿上升沿检测事件后,计数器清零,同时把检测改成沿下降沿检测。记录溢出事件发生的次数,发生第二次捕获事件时再次读取计数器的值,计算。\n\n公式:T=(N*(ARR+1)+CRR)*(psc+1)/Ft;\n T是持续时间,N为两次捕获事件期间的溢出次数,\n ARR为重装载值,CRR是第二次捕获事件时计数器值,\n psc是定时器预分频系数,Ft是定时器时钟源频率。\n*/\n\nTIM_HandleTypeDef g_tim3_handle; /* 定时器3句柄 */\nTIM_HandleTypeDef g_tim2_handle; /* 定时器2句柄 */\n\n/**\n * @brief 通用定时器TIMX定时中断初始化函数\n * @note\n * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\n * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\n * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\n * Ft=定时器工作频率,单位:Mhz\n *\n * @param arr: 自动重装值。\n * @param psc: 时钟预分频数\n * @retval 无\n */\nvoid gtim_tim3_int_init(uint16_t arr, uint16_t psc)\n{\n __HAL_RCC_TIM3_CLK_ENABLE(); /* 使能TIMx时钟 */\n\n g_tim3_handle.Instance = TIM3; /* 通用定时器x */\n g_tim3_handle.Init.Prescaler = psc; /* 预分频系数 */\n g_tim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */\n g_tim3_handle.Init.Period = arr; /* 自动装载值 */\n HAL_TIM_Base_Init(\u0026g_tim3_handle);\n\n HAL_NVIC_SetPriority(TIM3_IRQn, 1, 3); /* 设置中断优先级,抢占优先级1,子优先级3 */\n HAL_NVIC_EnableIRQ(TIM3_IRQn); /* 开启ITMx中断 */\n\n HAL_TIM_Base_Start_IT(\u0026g_tim3_handle); /* 使能定时器x和定时器x更新中断 */\n}\n\nvoid gtim_tim2_int_init(uint16_t arr, uint16_t psc)\n{\n __HAL_RCC_TIM2_CLK_ENABLE(); /* 使能TIMx时钟 */\n\n g_tim2_handle.Instance = TIM2; /* 通用定时器x */\n g_tim2_handle.Init.Prescaler = psc; /* 预分频系数 */\n g_tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */\n g_tim2_handle.Init.Period = arr; /* 自动装载值 */\n HAL_TIM_Base_Init(\u0026g_tim2_handle);\n\n HAL_NVIC_SetPriority(TIM2_IRQn, 1, 2); /* 设置中断优先级,抢占优先级1,子优先级3 */\n HAL_NVIC_EnableIRQ(TIM2_IRQn); /* 开启ITMx中断 */\n\n HAL_TIM_Base_Start_IT(\u0026g_tim2_handle); /* 使能定时器x和定时器x更新中断 */\n}\n\n/**\n * @brief 定时器中断服务函数\n * @param 无\n * @retval 无\n */\nvoid TIM3_IRQHandler(void)\n{\n /* 直接通过判断中断标志位的方式 */\n if(__HAL_TIM_GET_FLAG(\u0026g_tim3_handle, TIM_FLAG_UPDATE) != RESET)\n {\n //LED0_TOGGLE();\n //HAL_TIM_IRQHandler(\u0026g_tim3_handle); /* 定时器中断公共处理函数,在btim.c里定义的 如果取消注释会看见0和1一起闪烁 */\n __HAL_TIM_CLEAR_IT(\u0026g_tim3_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n\nvoid TIM2_IRQHandler(void)\n{\n /* 直接通过判断中断标志位的方式 */\n if(__HAL_TIM_GET_FLAG(\u0026g_tim2_handle, TIM_FLAG_UPDATE) != RESET)\n {\n //LED1_TOGGLE();\n //HAL_TIM_IRQHandler(\u0026g_tim2_handle); \n __HAL_TIM_CLEAR_IT(\u0026g_tim2_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n\n/*********************************以下是通用定时器PWM输出实验程序*************************************/\n\nTIM_HandleTypeDef g_timx_pwm_chy_handle; /* 定时器x句柄 */\n\n/**\n * @brief 通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)\n * @note\n * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\n * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\n * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\n * Ft=定时器工作频率,单位:Mhz\n *\n * @param arr: 自动重装值。\n * @param psc: 时钟预分频数\n * @retval 无\n */\nvoid gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)\n{\n TIM_OC_InitTypeDef timx_oc_pwm_chy = {0}; /* 定时器PWM输出配置 */\n\n g_timx_pwm_chy_handle.Instance = GTIM_TIMX_PWM; /* 定时器x */\n g_timx_pwm_chy_handle.Init.Prescaler = psc; /* 定时器分频 */\n g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */\n g_timx_pwm_chy_handle.Init.Period = arr; /* 自动重装载值 */\n HAL_TIM_PWM_Init(\u0026g_timx_pwm_chy_handle); /* 初始化PWM */\n\n timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */\n timx_oc_pwm_chy.Pulse = arr / 2; /* 设置比较值,此值用来确定占空比 */\n /* 默认比较值为自动重装载值的一半,即占空比为50% */\n timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH; /* 输出比较极性为高 */\n HAL_TIM_PWM_ConfigChannel(\u0026g_timx_pwm_chy_handle, \u0026timx_oc_pwm_chy, GTIM_TIMX_PWM_CHY); /* 配置TIMx通道y */\n HAL_TIM_PWM_Start(\u0026g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY); /* 开启对应PWM通道 */\n}\n\n/**\n * @brief 定时器底层驱动,时钟使能,引脚配置\n 此函数会被HAL_TIM_PWM_Init()调用\n * @param htim:定时器句柄\n * @retval 无\n */\nvoid HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)\n{\n if (htim-\u003eInstance == GTIM_TIMX_PWM)\n {\n GPIO_InitTypeDef gpio_init_struct;\n GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE(); /* 开启通道y的CPIO时钟 */\n GTIM_TIMX_PWM_CHY_CLK_ENABLE();\n\n gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN; /* 通道y的CPIO口 */\n gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */\n gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n HAL_GPIO_Init(GTIM_TIMX_PWM_CHY_GPIO_PORT, \u0026gpio_init_struct);\n GTIM_TIMX_PWM_CHY_GPIO_REMAP(); /* IO口REMAP设置, 是否必要查看头文件配置的说明 */\n }\n}\n\n/*********************************通用定时器输入捕获实验程序*************************************/\n\nTIM_HandleTypeDef g_timx_cap_chy_handle; /* 定时器x句柄 */\n\n/**\n * @brief 通用定时器TIMX 通道Y 输入捕获 初始化函数\n * @note\n * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\n * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\n * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\n * Ft=定时器工作频率,单位:Mhz\n *\n * @param arr: 自动重装值\n * @param psc: 时钟预分频数\n * @retval 无\n */\nvoid gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc)\n{\n TIM_IC_InitTypeDef timx_ic_cap_chy = {0};\n\n g_timx_cap_chy_handle.Instance = GTIM_TIMX_CAP; /* 定时器5 */\n g_timx_cap_chy_handle.Init.Prescaler = psc; /* 定时器分频 */\n g_timx_cap_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */\n g_timx_cap_chy_handle.Init.Period = arr; /* 自动重装载值 */\n HAL_TIM_IC_Init(\u0026g_timx_cap_chy_handle);\n\n timx_ic_cap_chy.ICPolarity = TIM_ICPOLARITY_RISING; /* 上升沿捕获 一共有三种模式RISING、FALLING、BOTHEDGE */\n timx_ic_cap_chy.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上,即映射到通道1上;一共有三种模式DIRECTTI、INDIRECTTITRC,即TI1、YI2、TRC */\n timx_ic_cap_chy.ICPrescaler = TIM_ICPSC_DIV1; /* 配置输入分频,不分频 可以设置为每2、4、8个事件触发一次捕获,吧1改成对应数字即可*/\n timx_ic_cap_chy.ICFilter = 0; /* 配置输入滤波器,不滤波。这个值可以是0~16之间的整数,对应16个模式见捕获/比较模式寄存器1(TIMx_CCMR1)的位7:4 */\n HAL_TIM_IC_ConfigChannel(\u0026g_timx_cap_chy_handle, \u0026timx_ic_cap_chy, GTIM_TIMX_CAP_CHY); /* 配置TIM5通道1 */\n\n __HAL_TIM_ENABLE_IT(\u0026g_timx_cap_chy_handle, TIM_IT_UPDATE); /* 使能更新中断 */\n HAL_TIM_IC_Start_IT(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 开始捕获TIM5的通道1 */\n}\n\n/**\n * @brief 通用定时器输入捕获初始化接口\n HAL库调用的接口,用于配置不同的输入捕获\n * @param htim:定时器句柄\n * @note 此函数会被HAL_TIM_IC_Init()调用\n * @retval 无\n */\nvoid HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)\n{\n if (htim-\u003eInstance == GTIM_TIMX_CAP) /*输入通道捕获*/\n {\n GPIO_InitTypeDef gpio_init_struct;\n GTIM_TIMX_CAP_CHY_CLK_ENABLE(); /* 使能TIMx时钟 */\n GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE(); /* 开启捕获IO的时钟 */\n\n gpio_init_struct.Pin = GTIM_TIMX_CAP_CHY_GPIO_PIN; /* 输入捕获的GPIO口 */\n gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */\n gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n HAL_GPIO_Init(GTIM_TIMX_CAP_CHY_GPIO_PORT, \u0026gpio_init_struct);\n\n HAL_NVIC_SetPriority(GTIM_TIMX_CAP_IRQn, 1, 3); /* 抢占1,子优先级3 */\n HAL_NVIC_EnableIRQ(GTIM_TIMX_CAP_IRQn); /* 开启ITMx中断 */\n }\n}\n\n/* 输入捕获状态(g_timxchy_cap_sta)\n * [7] :0,没有成功的捕获;1,成功捕获到一次.\n * [6] :0,还没捕获到高电平;1,已经捕获到高电平了.\n * [5:0]:捕获高电平后溢出的次数,最多溢出63次,所以最长捕获值 = 63*65536 + 65535 = 4194303\n * 注意:为了通用,我们默认ARR和CCRy都是16位寄存器,对于32位的定时器(如:TIM5),也只按16位使用\n * 按1us的计数频率,最长溢出时间为:4194303 us, 约4.19秒\n *\n * (说明一下:正常32位定时器来说,1us计数器加1,溢出时间:4294秒)\n */\nuint8_t g_timxchy_cap_sta = 0; /* 输入捕获状态 */\nuint16_t g_timxchy_cap_val = 0; /* 输入捕获值 */\n\n/**\n * @brief 定时器中断服务函数\n * @param 无\n * @retval 无\n */\nvoid GTIM_TIMX_CAP_IRQHandler(void)\n{\n HAL_TIM_IRQHandler(\u0026g_timx_cap_chy_handle); /* 定时器HAL库共用处理函数 */\n}\n\n/**\n * @brief 定时器输入捕获中断处理回调函数\n * @param htim:定时器句柄指针\n * @note 该函数在HAL_TIM_IRQHandler中会被调用\n * @retval 无\n */\nvoid HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)\n{ \n if (htim-\u003eInstance == GTIM_TIMX_CAP)\n {\n LED1_TOGGLE();\n if ((g_timxchy_cap_sta \u0026 0X80) == 0) /* 还未成功捕获(第7位为0)(即上一次捕获还未完成) */\n {\n if (g_timxchy_cap_sta \u0026 0X40) /* 已经捕获过上升沿了,这次捕获到的是一个下降沿(第6位为1) */\n {\n g_timxchy_cap_sta |= 0X80; /* 标记成功捕获到一次高电平脉宽 */\n g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 获取当前的捕获值 */\n TIM_RESET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */\n TIM_SET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING); /* 配置TIM5通道1上升沿捕获 */\n }\n else /* 还未开始,第一次捕获上升沿 */\n {\n g_timxchy_cap_sta = 0; /* 清空 */\n g_timxchy_cap_val = 0;\n g_timxchy_cap_sta |= 0X40; /* 标记捕获到了上升沿 */\n __HAL_TIM_SET_COUNTER(\u0026g_timx_cap_chy_handle, 0); /* 定时器5计数器清零 */\n TIM_RESET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置!! */\n TIM_SET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING); /* 定时器5通道1设置为下降沿捕获 */\n }\n }\n }\n}\n\n/**\n * @brief 定时器更新中断回调函数\n * @param htim:定时器句柄指针\n * @note 此函数会被定时器中断函数共同调用的\n * @retval 无\n */\nvoid HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)\n{\n if (htim-\u003eInstance == GTIM_TIMX_CAP)\n {\n if ((g_timxchy_cap_sta \u0026 0X80) == 0) /* 还未成功捕获 */\n {\n if (g_timxchy_cap_sta \u0026 0X40) /* 已经捕获到高电平了 */\n {\n if ((g_timxchy_cap_sta \u0026 0X3F) == 0X3F) /* 高电平太长了,已经累计满了 */\n {\n TIM_RESET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */\n TIM_SET_CAPTUREPOLARITY(\u0026g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */\n g_timxchy_cap_sta |= 0X80; /* 标记成功捕获了一次 */\n g_timxchy_cap_val = 0XFFFF;\n }\n else /* 累计定时器溢出次数 */\n {\n g_timxchy_cap_sta++;\n }\n }\n }\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d基本介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e通用定时器:TIM2、3、4、5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 和基本定时器相比,通用定时器的计数器允许递增、递减、中心对齐三种计数模式;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 用途上不仅可以触发DAC(数模转换),还可以触发ADC(模数转换);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 中断条件上,除了更新事件外还有触发事件、输入捕获、输出比较\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 额外拥有4个独立通道,可用于输入捕获、输出比较、PMW输出、单脉冲模式\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 可以用外部信号控制定时器,可以实现多个定时器互联的同步电路(级联,即用某个定时器的溢出事件来作为下一个定时器的时钟信号)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 支持编码器和霍尔传感器电路\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 时钟源可以来自于:系统总线(APB,即内部时钟)、内部触发输入时钟(来自鱼其它定时器的控制器等)、IO引脚复用为定时器ETR引脚(外部时钟模式二)、本定时器通道一、通道二(外部时钟模式一)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e IO引脚复用查看STM32F103ZET6.pdf,搜索ETR即可。搜到的第二个TIM8_ETR就是,前面的PA0-WKUP就是引脚名称,在前面的数字即使引脚编号,查看自己芯片的封装类别即可。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通道同理,搜CH1和CH2即可。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 控制器:可以接入其它定时器的内部触发输入,也可以到DAC/ADC。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 输入捕获、捕获/比较、输出比较:以CH1通道为例\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 外部信号-\u0026gt;IO引脚-\u0026gt;(滤波器、边沿检测器)-\u0026gt;产生捕获信号到捕获寄存器1或者2(除了事件外还可以产生中断,只不过中断需要配置)-\u0026gt;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 将计数器当前值转移到捕获/比较影子寄存器,输入模式下再转移到捕获/比较预装载寄存器用于程序读取,输出模式下将捕获/比较预装载寄存器值转移到其影子寄存器(缓冲)-\u0026gt;与计数器值比较-\u0026gt;若相等-\u0026gt;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 改变输出信号(输出信号高电平有效),并产生比较事件(如果配置了还会产生中断)-\u0026gt;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 信号传到输出控制模块-\u0026gt;输出控制模块产生输出信号到本通道输出引脚。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 注:输出引脚和输入引脚是同一引脚,它们是分时复用的关系,同时只有一边有效。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d时钟源介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 内部时钟,设置 TIMx_SMCR 的 SMS=0000,与基本定时器一样,时钟源来自系统总线(APB)时钟,预分频器大于2时会*2 。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 外部时钟模式一,设置 TIMx_SMCR 的 SMS=1111,来自外部输入引脚(TIx),一共有三种信号:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 当时钟源来自边沿检测器前的信号(TI1F_ED信号),时钟源信号是一个双边沿检测信号,不论是上升沿还是下降沿都会触发计数器的计数,注意这个信号只对通道1有效。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 来自于边沿检测器后的信号(TI1FP1、TI2FP2信号),是一个单边沿检测信号,根据配置决定上升沿还是下降沿,对通道1和2都有效。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 这三种信号都可以设置是否滤波(TIMx_CCMR1的IC1F位),以及滤波器滤波的频率(TIMx_CR1的CDK位)。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 数字滤波器的详细说明:在设置好工作频率后,还会设置采样次数(N),只有在采样器以工作频率连续采样到N个与当前输出值不同的输入信号时,才会更新输出值,当 8 次采样中有高有低,那就保持原来的输出。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 比如N等于8,原本输出低电平,第一次采样信号为高电平,第二次采样为低电平,但此时输出仍是低电平,且这8次采样的结果不会计入下一轮采样;只有当9~16次采样信号全部都是高电平时输出才会是高电平。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 外部时钟模式2,设置 TIMx_SMCR 的 ECE=1,来自外部触发输入(TIMx_ETR);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 内部触发输入,来自其它定时器的控制器(TIRx,x=0、1、2、3)。设置方式参考F10XXX参考手册的定时器同步章节,各个TIR信号编码查看从模式控制寄存器(TIMx_SMCR)的TS位,关于每个定时器中ITRx的细节,参见参考手册的表78。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d输出比较部分介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 捕获/比较预装载寄存器何时会将值装在到其影子寄存器里(三个条件必须同时满足):\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 当CCR1寄存器未处于被操作状态时;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 当通道被配置未输出时;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 该寄存器没有配置缓冲使能或定时器产生更新事件时。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 捕获/比较通道的输出部分(以通道1为例):\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 寄存器将比较结果传到输出控制模块,输出控制模块根据配置(CCMR1的OC1M位)产生输出信号(OC1REF信号,高电平有效),这个信号再根据配置(CCER的CC1P位)决定是否反转,并输出到IO引脚(OC1信号)。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 输出PWM原理:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 当计数器的值大于等于捕获/比较寄存器(CRR)的值时,输出逻辑为1,否则为0。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 那么我们通过设置计数周期以及重装载寄存器(ARR)的值就可以产生一个我们需要的波形。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ARR越大,周期越大、频率越小;CRR则与占空比相关,具体看计数器的计数方式。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002dPWM模式介绍\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PWM有两种模式。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PWM模式一:CNT\u0026lt;CCR1是为有效电平(OC1REF=1),CNT\u0026gt;=CR1是为无效电平(OC1REF=0)。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PWM模式二:与模式一相反。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d-输入捕获测量脉宽信号原理\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d\u002d-*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e简单来说就是通过两次捕获事件时计数器值之差,再加上这段时间内溢出事件的次数,就可以计算两次捕获事件的间隔时间。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e具体过程:捕获到一个沿上升沿检测事件后,计数器清零,同时把检测改成沿下降沿检测。记录溢出事件发生的次数,发生第二次捕获事件时再次读取计数器的值,计算。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e公式:T=(N*(ARR+1)+CRR)*(psc+1)/Ft;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e T是持续时间,N为两次捕获事件期间的溢出次数,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ARR为重装载值,CRR是第二次捕获事件时计数器值,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e psc是定时器预分频系数,Ft是定时器时钟源频率。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef g_tim3_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器3句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef g_tim2_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器2句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通用定时器TIMX定时中断初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * Ft=定时器工作频率,单位:Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 自动重装值。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 时钟预分频数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_tim3_int_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM3_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能TIMx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim3_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器x */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim3_handle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e psc;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 预分频系数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim3_handle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 递增计数模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim3_handle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e arr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 自动装载值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim3_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM3_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置中断优先级,抢占优先级1,子优先级3 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM3_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ITMx中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim3_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能定时器x和定时器x更新中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_tim2_int_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能TIMx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim2_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通用定时器x */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim2_handle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e psc;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 预分频系数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim2_handle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 递增计数模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_tim2_handle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e arr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 自动装载值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim2_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置中断优先级,抢占优先级1,子优先级3 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM2_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ITMx中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能定时器x和定时器x更新中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 定时器中断服务函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM3_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 直接通过判断中断标志位的方式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim3_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//LED0_TOGGLE();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//HAL_TIM_IRQHandler(\u0026amp;g_tim3_handle); /* 定时器中断公共处理函数,在btim.c里定义的 如果取消注释会看见0和1一起闪烁 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim3_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM2_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 直接通过判断中断标志位的方式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim2_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//LED1_TOGGLE();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//HAL_TIM_IRQHandler(\u0026amp;g_tim2_handle); \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim2_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*********************************以下是通用定时器PWM输出实验程序*************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef g_timx_pwm_chy_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器x句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * Ft=定时器工作频率,单位:Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 自动重装值。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 时钟预分频数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_timx_pwm_chy_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_OC_InitTypeDef timx_oc_pwm_chy \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器PWM输出配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_pwm_chy_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_PWM;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器x */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_pwm_chy_handle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e psc;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器分频 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_pwm_chy_handle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 递增计数模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_pwm_chy_handle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e arr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 自动重装载值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_PWM_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_pwm_chy_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化PWM */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_oc_pwm_chy.OCMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_OCMODE_PWM1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模式选择PWM1 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_oc_pwm_chy.Pulse \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e arr \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置比较值,此值用来确定占空比 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 默认比较值为自动重装载值的一半,即占空比为50% */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_oc_pwm_chy.OCPolarity \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_OCPOLARITY_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输出比较极性为高 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_PWM_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_pwm_chy_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003etimx_oc_pwm_chy, GTIM_TIMX_PWM_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置TIMx通道y */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启对应PWM通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 定时器底层驱动,时钟使能,引脚配置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 此函数会被HAL_TIM_PWM_Init()调用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:定时器句柄\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_PWM_MspInit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (htim-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_PWM)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启通道y的CPIO时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_PWM_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道y的CPIO口 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_AF_PP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 复用推完输出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLUP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GTIM_TIMX_PWM_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_PWM_CHY_GPIO_REMAP\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* IO口REMAP设置, 是否必要查看头文件配置的说明 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*********************************通用定时器输入捕获实验程序*************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef g_timx_cap_chy_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器x句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通用定时器TIMX 通道Y 输入捕获 初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * Ft=定时器工作频率,单位:Mhz\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 自动重装值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 时钟预分频数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003egtim_timx_cap_chy_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003earr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epsc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_IC_InitTypeDef timx_ic_cap_chy \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_cap_chy_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_CAP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器5 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_cap_chy_handle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e psc;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器分频 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_cap_chy_handle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 递增计数模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timx_cap_chy_handle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e arr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 自动重装载值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_ic_cap_chy.ICPolarity \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPOLARITY_RISING;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上升沿捕获 一共有三种模式RISING、FALLING、BOTHEDGE */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_ic_cap_chy.ICSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICSELECTION_DIRECTTI;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 映射到TI1上,即映射到通道1上;一共有三种模式DIRECTTI、INDIRECTTITRC,即TI1、YI2、TRC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_ic_cap_chy.ICPrescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPSC_DIV1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置输入分频,不分频 可以设置为每2、4、8个事件触发一次捕获,吧1改成对应数字即可*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e timx_ic_cap_chy.ICFilter \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置输入滤波器,不滤波。这个值可以是0~16之间的整数,对应16个模式见捕获/比较模式寄存器1(TIMx_CCMR1)的位7:4 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003etimx_ic_cap_chy, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置TIM5通道1 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_ENABLE_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能更新中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IC_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开始捕获TIM5的通道1 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通用定时器输入捕获初始化接口\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e HAL库调用的接口,用于配置不同的输入捕获\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:定时器句柄\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 此函数会被HAL_TIM_IC_Init()调用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IC_MspInit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (htim-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_CAP)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输入通道捕获*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能TIMx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启捕获IO的时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_CAP_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入捕获的GPIO口 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_AF_PP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 复用推挽输出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLDOWN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 下拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GTIM_TIMX_CAP_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GTIM_TIMX_CAP_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 抢占1,子优先级3 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GTIM_TIMX_CAP_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ITMx中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 输入捕获状态(g_timxchy_cap_sta)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u0026#91;7\u0026#93; :0,没有成功的捕获;1,成功捕获到一次.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u0026#91;6\u0026#93; :0,还没捕获到高电平;1,已经捕获到高电平了.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u0026#91;5:0\u0026#93;:捕获高电平后溢出的次数,最多溢出63次,所以最长捕获值 = 63*65536 + 65535 = 4194303\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意:为了通用,我们默认ARR和CCRy都是16位寄存器,对于32位的定时器(如:TIM5),也只按16位使用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 按1us的计数频率,最长溢出时间为:4194303 us, 约4.19秒\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * (说明一下:正常32位定时器来说,1us计数器加1,溢出时间:4294秒)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入捕获状态 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输入捕获值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 定时器中断服务函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eGTIM_TIMX_CAP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器HAL库共用处理函数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 定时器输入捕获中断处理回调函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:定时器句柄指针\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 该函数在HAL_TIM_IRQHandler中会被调用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_IC_CaptureCallback\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (htim-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_CAP)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED1_TOGGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e80\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 还未成功捕获(第7位为0)(即上一次捕获还未完成) */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 已经捕获过上升沿了,这次捕获到的是一个下降沿(第6位为1) */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e80\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 标记成功捕获到一次高电平脉宽 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_ReadCapturedValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 获取当前的捕获值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_RESET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 一定要先清除原来的设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_SET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置TIM5通道1上升沿捕获 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 还未开始,第一次捕获上升沿 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清空 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 标记捕获到了上升沿 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_SET_COUNTER\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器5计数器清零 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_RESET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 一定要先清除原来的设置!! */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_SET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器5通道1设置为下降沿捕获 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 定时器更新中断回调函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:定时器句柄指针\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 此函数会被定时器中断函数共同调用的\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehtim\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (htim-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GTIM_TIMX_CAP)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e80\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 还未成功捕获 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 已经捕获到高电平了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3F\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3F\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高电平太长了,已经累计满了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_RESET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 一定要先清除原来的设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM_SET_CAPTUREPOLARITY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 配置TIM5通道1上升沿捕获 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e80\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 标记成功捕获了一次 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e0X\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003eFFFF\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 累计定时器溢出次数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_timxchy_cap_sta\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":359,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"
/*------------------------基本介绍------------------------*/

/*
通用定时器:TIM2、3、4、5
和基本定时器相比,通用定时器的计数器允许递增、递减、中心对齐三种计数模式;
用途上不仅可以触发DAC(数模转换),还可以触发ADC(模数转换);
中断条件上,除了更新事件外还有触发事件、输入捕获、输出比较

额外拥有4个独立通道,可用于输入捕获、输出比较、PMW输出、单脉冲模式

可以用外部信号控制定时器,可以实现多个定时器互联的同步电路(级联,即用某个定时器的溢出事件来作为下一个定时器的时钟信号)

支持编码器和霍尔传感器电路

时钟源可以来自于:系统总线(APB,即内部时钟)、内部触发输入时钟(来自鱼其它定时器的控制器等)、IO引脚复用为定时器ETR引脚(外部时钟模式二)、本定时器通道一、通道二(外部时钟模式一)
IO引脚复用查看STM32F103ZET6.pdf,搜索ETR即可。搜到的第二个TIM8_ETR就是,前面的PA0-WKUP就是引脚名称,在前面的数字即使引脚编号,查看自己芯片的封装类别即可。
通道同理,搜CH1和CH2即可。

控制器:可以接入其它定时器的内部触发输入,也可以到DAC/ADC。

输入捕获、捕获/比较、输出比较:以CH1通道为例
外部信号->IO引脚->(滤波器、边沿检测器)->产生捕获信号到捕获寄存器1或者2(除了事件外还可以产生中断,只不过中断需要配置)->
将计数器当前值转移到捕获/比较影子寄存器,输入模式下再转移到捕获/比较预装载寄存器用于程序读取,输出模式下将捕获/比较预装载寄存器值转移到其影子寄存器(缓冲)->与计数器值比较->若相等->
改变输出信号(输出信号高电平有效),并产生比较事件(如果配置了还会产生中断)->
信号传到输出控制模块->输出控制模块产生输出信号到本通道输出引脚。
注:输出引脚和输入引脚是同一引脚,它们是分时复用的关系,同时只有一边有效。

*/

/*------------------------时钟源介绍------------------------*/
/*
内部时钟,设置 TIMx_SMCR 的 SMS=0000,与基本定时器一样,时钟源来自系统总线(APB)时钟,预分频器大于2时会*2 。
外部时钟模式一,设置 TIMx_SMCR 的 SMS=1111,来自外部输入引脚(TIx),一共有三种信号:
当时钟源来自边沿检测器前的信号(TI1F_ED信号),时钟源信号是一个双边沿检测信号,不论是上升沿还是下降沿都会触发计数器的计数,注意这个信号只对通道1有效。
来自于边沿检测器后的信号(TI1FP1、TI2FP2信号),是一个单边沿检测信号,根据配置决定上升沿还是下降沿,对通道1和2都有效。
这三种信号都可以设置是否滤波(TIMx_CCMR1的IC1F位),以及滤波器滤波的频率(TIMx_CR1的CDK位)。
数字滤波器的详细说明:在设置好工作频率后,还会设置采样次数(N),只有在采样器以工作频率连续采样到N个与当前输出值不同的输入信号时,才会更新输出值,当 8 次采样中有高有低,那就保持原来的输出。
比如N等于8,原本输出低电平,第一次采样信号为高电平,第二次采样为低电平,但此时输出仍是低电平,且这8次采样的结果不会计入下一轮采样;只有当9~16次采样信号全部都是高电平时输出才会是高电平。
外部时钟模式2,设置 TIMx_SMCR 的 ECE=1,来自外部触发输入(TIMx_ETR);
内部触发输入,来自其它定时器的控制器(TIRx,x=0、1、2、3)。设置方式参考F10XXX参考手册的定时器同步章节,各个TIR信号编码查看从模式控制寄存器(TIMx_SMCR)的TS位,关于每个定时器中ITRx的细节,参见参考手册的表78。
*/

/*------------------------输出比较部分介绍------------------------*/
/*
捕获/比较预装载寄存器何时会将值装在到其影子寄存器里(三个条件必须同时满足):
当CCR1寄存器未处于被操作状态时;
当通道被配置未输出时;
该寄存器没有配置缓冲使能或定时器产生更新事件时。

捕获/比较通道的输出部分(以通道1为例):
寄存器将比较结果传到输出控制模块,输出控制模块根据配置(CCMR1的OC1M位)产生输出信号(OC1REF信号,高电平有效),这个信号再根据配置(CCER的CC1P位)决定是否反转,并输出到IO引脚(OC1信号)。

输出PWM原理:
当计数器的值大于等于捕获/比较寄存器(CRR)的值时,输出逻辑为1,否则为0。
那么我们通过设置计数周期以及重装载寄存器(ARR)的值就可以产生一个我们需要的波形。
ARR越大,周期越大、频率越小;CRR则与占空比相关,具体看计数器的计数方式。

*/

/*------------------------PWM模式介绍------------------------*/
/*
PWM有两种模式。
PWM模式一:CNT&lt;CCR1是为有效电平(OC1REF=1),CNT>=CR1是为无效电平(OC1REF=0)。
PWM模式二:与模式一相反。

*/

/*---------------输入捕获测量脉宽信号原理---------------*/
/*
简单来说就是通过两次捕获事件时计数器值之差,再加上这段时间内溢出事件的次数,就可以计算两次捕获事件的间隔时间。

具体过程:捕获到一个沿上升沿检测事件后,计数器清零,同时把检测改成沿下降沿检测。记录溢出事件发生的次数,发生第二次捕获事件时再次读取计数器的值,计算。

公式:T=(N*(ARR+1)+CRR)*(psc+1)/Ft;
T是持续时间,N为两次捕获事件期间的溢出次数,
ARR为重装载值,CRR是第二次捕获事件时计数器值,
psc是定时器预分频系数,Ft是定时器时钟源频率。
*/

TIM_HandleTypeDef g_tim3_handle; /* 定时器3句柄 */
TIM_HandleTypeDef g_tim2_handle; /* 定时器2句柄 */

/**
* @brief 通用定时器TIMX定时中断初始化函数
* @note
* 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
* 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz
* 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
* Ft=定时器工作频率,单位:Mhz
*
* @param arr: 自动重装值。
* @param psc: 时钟预分频数
* @retval 无
*/
void gtim_tim3_int_init(uint16_t arr, uint16_t psc)
{
__HAL_RCC_TIM3_CLK_ENABLE(); /* 使能TIMx时钟 */

g_tim3_handle.Instance = TIM3; /* 通用定时器x */
g_tim3_handle.Init.Prescaler = psc; /* 预分频系数 */
g_tim3_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_tim3_handle.Init.Period = arr; /* 自动装载值 */
HAL_TIM_Base_Init(&amp;g_tim3_handle);

HAL_NVIC_SetPriority(TIM3_IRQn, 1, 3); /* 设置中断优先级,抢占优先级1,子优先级3 */
HAL_NVIC_EnableIRQ(TIM3_IRQn); /* 开启ITMx中断 */

HAL_TIM_Base_Start_IT(&amp;g_tim3_handle); /* 使能定时器x和定时器x更新中断 */
}

void gtim_tim2_int_init(uint16_t arr, uint16_t psc)
{
__HAL_RCC_TIM2_CLK_ENABLE(); /* 使能TIMx时钟 */

g_tim2_handle.Instance = TIM2; /* 通用定时器x */
g_tim2_handle.Init.Prescaler = psc; /* 预分频系数 */
g_tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_tim2_handle.Init.Period = arr; /* 自动装载值 */
HAL_TIM_Base_Init(&amp;g_tim2_handle);

HAL_NVIC_SetPriority(TIM2_IRQn, 1, 2); /* 设置中断优先级,抢占优先级1,子优先级3 */
HAL_NVIC_EnableIRQ(TIM2_IRQn); /* 开启ITMx中断 */

HAL_TIM_Base_Start_IT(&amp;g_tim2_handle); /* 使能定时器x和定时器x更新中断 */
}

/**
* @brief 定时器中断服务函数
* @param 无
* @retval 无
*/
void TIM3_IRQHandler(void)
{
/* 直接通过判断中断标志位的方式 */
if(__HAL_TIM_GET_FLAG(&amp;g_tim3_handle, TIM_FLAG_UPDATE) != RESET)
{
//LED0_TOGGLE();
//HAL_TIM_IRQHandler(&amp;g_tim3_handle); /* 定时器中断公共处理函数,在btim.c里定义的 如果取消注释会看见0和1一起闪烁 */
__HAL_TIM_CLEAR_IT(&amp;g_tim3_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}

void TIM2_IRQHandler(void)
{
/* 直接通过判断中断标志位的方式 */
if(__HAL_TIM_GET_FLAG(&amp;g_tim2_handle, TIM_FLAG_UPDATE) != RESET)
{
//LED1_TOGGLE();
//HAL_TIM_IRQHandler(&amp;g_tim2_handle);
__HAL_TIM_CLEAR_IT(&amp;g_tim2_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}

/*********************************以下是通用定时器PWM输出实验程序*************************************/

TIM_HandleTypeDef g_timx_pwm_chy_handle; /* 定时器x句柄 */

/**
* @brief 通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)
* @note
* 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
* 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz
* 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
* Ft=定时器工作频率,单位:Mhz
*
* @param arr: 自动重装值。
* @param psc: 时钟预分频数
* @retval 无
*/
void gtim_timx_pwm_chy_init(uint16_t arr, uint16_t psc)
{
TIM_OC_InitTypeDef timx_oc_pwm_chy = {0}; /* 定时器PWM输出配置 */

g_timx_pwm_chy_handle.Instance = GTIM_TIMX_PWM; /* 定时器x */
g_timx_pwm_chy_handle.Init.Prescaler = psc; /* 定时器分频 */
g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_pwm_chy_handle.Init.Period = arr; /* 自动重装载值 */
HAL_TIM_PWM_Init(&amp;g_timx_pwm_chy_handle); /* 初始化PWM */

timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
timx_oc_pwm_chy.Pulse = arr / 2; /* 设置比较值,此值用来确定占空比 */
/* 默认比较值为自动重装载值的一半,即占空比为50% */
timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH; /* 输出比较极性为高 */
HAL_TIM_PWM_ConfigChannel(&amp;g_timx_pwm_chy_handle, &amp;timx_oc_pwm_chy, GTIM_TIMX_PWM_CHY); /* 配置TIMx通道y */
HAL_TIM_PWM_Start(&amp;g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY); /* 开启对应PWM通道 */
}

/**
* @brief 定时器底层驱动,时钟使能,引脚配置
此函数会被HAL_TIM_PWM_Init()调用
* @param htim:定时器句柄
* @retval 无
*/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_PWM)
{
GPIO_InitTypeDef gpio_init_struct;
GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE(); /* 开启通道y的CPIO时钟 */
GTIM_TIMX_PWM_CHY_CLK_ENABLE();

gpio_init_struct.Pin = GTIM_TIMX_PWM_CHY_GPIO_PIN; /* 通道y的CPIO口 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GTIM_TIMX_PWM_CHY_GPIO_PORT, &amp;gpio_init_struct);
GTIM_TIMX_PWM_CHY_GPIO_REMAP(); /* IO口REMAP设置, 是否必要查看头文件配置的说明 */
}
}

/*********************************通用定时器输入捕获实验程序*************************************/

TIM_HandleTypeDef g_timx_cap_chy_handle; /* 定时器x句柄 */

/**
* @brief 通用定时器TIMX 通道Y 输入捕获 初始化函数
* @note
* 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候
* 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz
* 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.
* Ft=定时器工作频率,单位:Mhz
*
* @param arr: 自动重装值
* @param psc: 时钟预分频数
* @retval 无
*/
void gtim_timx_cap_chy_init(uint16_t arr, uint16_t psc)
{
TIM_IC_InitTypeDef timx_ic_cap_chy = {0};

g_timx_cap_chy_handle.Instance = GTIM_TIMX_CAP; /* 定时器5 */
g_timx_cap_chy_handle.Init.Prescaler = psc; /* 定时器分频 */
g_timx_cap_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_cap_chy_handle.Init.Period = arr; /* 自动重装载值 */
HAL_TIM_IC_Init(&amp;g_timx_cap_chy_handle);

timx_ic_cap_chy.ICPolarity = TIM_ICPOLARITY_RISING; /* 上升沿捕获 一共有三种模式RISING、FALLING、BOTHEDGE */
timx_ic_cap_chy.ICSelection = TIM_ICSELECTION_DIRECTTI; /* 映射到TI1上,即映射到通道1上;一共有三种模式DIRECTTI、INDIRECTTITRC,即TI1、YI2、TRC */
timx_ic_cap_chy.ICPrescaler = TIM_ICPSC_DIV1; /* 配置输入分频,不分频 可以设置为每2、4、8个事件触发一次捕获,吧1改成对应数字即可*/
timx_ic_cap_chy.ICFilter = 0; /* 配置输入滤波器,不滤波。这个值可以是0~16之间的整数,对应16个模式见捕获/比较模式寄存器1(TIMx_CCMR1)的位7:4 */
HAL_TIM_IC_ConfigChannel(&amp;g_timx_cap_chy_handle, &amp;timx_ic_cap_chy, GTIM_TIMX_CAP_CHY); /* 配置TIM5通道1 */

__HAL_TIM_ENABLE_IT(&amp;g_timx_cap_chy_handle, TIM_IT_UPDATE); /* 使能更新中断 */
HAL_TIM_IC_Start_IT(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 开始捕获TIM5的通道1 */
}

/**
* @brief 通用定时器输入捕获初始化接口
HAL库调用的接口,用于配置不同的输入捕获
* @param htim:定时器句柄
* @note 此函数会被HAL_TIM_IC_Init()调用
* @retval 无
*/
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP) /*输入通道捕获*/
{
GPIO_InitTypeDef gpio_init_struct;
GTIM_TIMX_CAP_CHY_CLK_ENABLE(); /* 使能TIMx时钟 */
GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE(); /* 开启捕获IO的时钟 */

gpio_init_struct.Pin = GTIM_TIMX_CAP_CHY_GPIO_PIN; /* 输入捕获的GPIO口 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GTIM_TIMX_CAP_CHY_GPIO_PORT, &amp;gpio_init_struct);

HAL_NVIC_SetPriority(GTIM_TIMX_CAP_IRQn, 1, 3); /* 抢占1,子优先级3 */
HAL_NVIC_EnableIRQ(GTIM_TIMX_CAP_IRQn); /* 开启ITMx中断 */
}
}

/* 输入捕获状态(g_timxchy_cap_sta)
* &#91;7&#93; :0,没有成功的捕获;1,成功捕获到一次.
* &#91;6&#93; :0,还没捕获到高电平;1,已经捕获到高电平了.
* &#91;5:0&#93;:捕获高电平后溢出的次数,最多溢出63次,所以最长捕获值 = 63*65536 + 65535 = 4194303
* 注意:为了通用,我们默认ARR和CCRy都是16位寄存器,对于32位的定时器(如:TIM5),也只按16位使用
* 按1us的计数频率,最长溢出时间为:4194303 us, 约4.19秒
*
* (说明一下:正常32位定时器来说,1us计数器加1,溢出时间:4294秒)
*/
uint8_t g_timxchy_cap_sta = 0; /* 输入捕获状态 */
uint16_t g_timxchy_cap_val = 0; /* 输入捕获值 */

/**
* @brief 定时器中断服务函数
* @param 无
* @retval 无
*/
void GTIM_TIMX_CAP_IRQHandler(void)
{
HAL_TIM_IRQHandler(&amp;g_timx_cap_chy_handle); /* 定时器HAL库共用处理函数 */
}

/**
* @brief 定时器输入捕获中断处理回调函数
* @param htim:定时器句柄指针
* @note 该函数在HAL_TIM_IRQHandler中会被调用
* @retval 无
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP)
{
LED1_TOGGLE();
if ((g_timxchy_cap_sta &amp; 0X80) == 0) /* 还未成功捕获(第7位为0)(即上一次捕获还未完成) */
{
if (g_timxchy_cap_sta &amp; 0X40) /* 已经捕获过上升沿了,这次捕获到的是一个下降沿(第6位为1) */
{
g_timxchy_cap_sta |= 0X80; /* 标记成功捕获到一次高电平脉宽 */
g_timxchy_cap_val = HAL_TIM_ReadCapturedValue(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 获取当前的捕获值 */
TIM_RESET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */
TIM_SET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING); /* 配置TIM5通道1上升沿捕获 */
}
else /* 还未开始,第一次捕获上升沿 */
{
g_timxchy_cap_sta = 0; /* 清空 */
g_timxchy_cap_val = 0;
g_timxchy_cap_sta |= 0X40; /* 标记捕获到了上升沿 */
__HAL_TIM_SET_COUNTER(&amp;g_timx_cap_chy_handle, 0); /* 定时器5计数器清零 */
TIM_RESET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置!! */
TIM_SET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING); /* 定时器5通道1设置为下降沿捕获 */
}
}
}
}

/**
* @brief 定时器更新中断回调函数
* @param htim:定时器句柄指针
* @note 此函数会被定时器中断函数共同调用的
* @retval 无
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == GTIM_TIMX_CAP)
{
if ((g_timxchy_cap_sta &amp; 0X80) == 0) /* 还未成功捕获 */
{
if (g_timxchy_cap_sta &amp; 0X40) /* 已经捕获到高电平了 */
{
if ((g_timxchy_cap_sta &amp; 0X3F) == 0X3F) /* 高电平太长了,已经累计满了 */
{
TIM_RESET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY); /* 一定要先清除原来的设置 */
TIM_SET_CAPTUREPOLARITY(&amp;g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);/* 配置TIM5通道1上升沿捕获 */
g_timxchy_cap_sta |= 0X80; /* 标记成功捕获了一次 */
g_timxchy_cap_val = 0XFFFF;
}
else /* 累计定时器溢出次数 */
{
g_timxchy_cap_sta++;
}
}
}
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">/*------------------------基本介绍------------------------*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390">通用定时器:TIM2、3、4、5</span></span>
<span class="line"><span style="color: #768390"> 和基本定时器相比,通用定时器的计数器允许递增、递减、中心对齐三种计数模式;</span></span>
<span class="line"><span style="color: #768390"> 用途上不仅可以触发DAC(数模转换),还可以触发ADC(模数转换);</span></span>
<span class="line"><span style="color: #768390"> 中断条件上,除了更新事件外还有触发事件、输入捕获、输出比较</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 额外拥有4个独立通道,可用于输入捕获、输出比较、PMW输出、单脉冲模式</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 可以用外部信号控制定时器,可以实现多个定时器互联的同步电路(级联,即用某个定时器的溢出事件来作为下一个定时器的时钟信号)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 支持编码器和霍尔传感器电路</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 时钟源可以来自于:系统总线(APB,即内部时钟)、内部触发输入时钟(来自鱼其它定时器的控制器等)、IO引脚复用为定时器ETR引脚(外部时钟模式二)、本定时器通道一、通道二(外部时钟模式一)</span></span>
<span class="line"><span style="color: #768390"> IO引脚复用查看STM32F103ZET6.pdf,搜索ETR即可。搜到的第二个TIM8_ETR就是,前面的PA0-WKUP就是引脚名称,在前面的数字即使引脚编号,查看自己芯片的封装类别即可。</span></span>
<span class="line"><span style="color: #768390"> 通道同理,搜CH1和CH2即可。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 控制器:可以接入其它定时器的内部触发输入,也可以到DAC/ADC。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 输入捕获、捕获/比较、输出比较:以CH1通道为例</span></span>
<span class="line"><span style="color: #768390"> 外部信号-&gt;IO引脚-&gt;(滤波器、边沿检测器)-&gt;产生捕获信号到捕获寄存器1或者2(除了事件外还可以产生中断,只不过中断需要配置)-&gt;</span></span>
<span class="line"><span style="color: #768390"> 将计数器当前值转移到捕获/比较影子寄存器,输入模式下再转移到捕获/比较预装载寄存器用于程序读取,输出模式下将捕获/比较预装载寄存器值转移到其影子寄存器(缓冲)-&gt;与计数器值比较-&gt;若相等-&gt;</span></span>
<span class="line"><span style="color: #768390"> 改变输出信号(输出信号高电平有效),并产生比较事件(如果配置了还会产生中断)-&gt;</span></span>
<span class="line"><span style="color: #768390"> 信号传到输出控制模块-&gt;输出控制模块产生输出信号到本通道输出引脚。</span></span>
<span class="line"><span style="color: #768390"> 注:输出引脚和输入引脚是同一引脚,它们是分时复用的关系,同时只有一边有效。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*------------------------时钟源介绍------------------------*/</span></span>
<span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390"> 内部时钟,设置 TIMx_SMCR 的 SMS=0000,与基本定时器一样,时钟源来自系统总线(APB)时钟,预分频器大于2时会*2 。</span></span>
<span class="line"><span style="color: #768390"> 外部时钟模式一,设置 TIMx_SMCR 的 SMS=1111,来自外部输入引脚(TIx),一共有三种信号:</span></span>
<span class="line"><span style="color: #768390"> 当时钟源来自边沿检测器前的信号(TI1F_ED信号),时钟源信号是一个双边沿检测信号,不论是上升沿还是下降沿都会触发计数器的计数,注意这个信号只对通道1有效。</span></span>
<span class="line"><span style="color: #768390"> 来自于边沿检测器后的信号(TI1FP1、TI2FP2信号),是一个单边沿检测信号,根据配置决定上升沿还是下降沿,对通道1和2都有效。</span></span>
<span class="line"><span style="color: #768390"> 这三种信号都可以设置是否滤波(TIMx_CCMR1的IC1F位),以及滤波器滤波的频率(TIMx_CR1的CDK位)。</span></span>
<span class="line"><span style="color: #768390"> 数字滤波器的详细说明:在设置好工作频率后,还会设置采样次数(N),只有在采样器以工作频率连续采样到N个与当前输出值不同的输入信号时,才会更新输出值,当 8 次采样中有高有低,那就保持原来的输出。</span></span>
<span class="line"><span style="color: #768390"> 比如N等于8,原本输出低电平,第一次采样信号为高电平,第二次采样为低电平,但此时输出仍是低电平,且这8次采样的结果不会计入下一轮采样;只有当9~16次采样信号全部都是高电平时输出才会是高电平。</span></span>
<span class="line"><span style="color: #768390"> 外部时钟模式2,设置 TIMx_SMCR 的 ECE=1,来自外部触发输入(TIMx_ETR);</span></span>
<span class="line"><span style="color: #768390"> 内部触发输入,来自其它定时器的控制器(TIRx,x=0、1、2、3)。设置方式参考F10XXX参考手册的定时器同步章节,各个TIR信号编码查看从模式控制寄存器(TIMx_SMCR)的TS位,关于每个定时器中ITRx的细节,参见参考手册的表78。</span></span>
<span class="line"><span style="color: #768390">*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*------------------------输出比较部分介绍------------------------*/</span></span>
<span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390"> 捕获/比较预装载寄存器何时会将值装在到其影子寄存器里(三个条件必须同时满足):</span></span>
<span class="line"><span style="color: #768390"> 当CCR1寄存器未处于被操作状态时;</span></span>
<span class="line"><span style="color: #768390"> 当通道被配置未输出时;</span></span>
<span class="line"><span style="color: #768390"> 该寄存器没有配置缓冲使能或定时器产生更新事件时。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 捕获/比较通道的输出部分(以通道1为例):</span></span>
<span class="line"><span style="color: #768390"> 寄存器将比较结果传到输出控制模块,输出控制模块根据配置(CCMR1的OC1M位)产生输出信号(OC1REF信号,高电平有效),这个信号再根据配置(CCER的CC1P位)决定是否反转,并输出到IO引脚(OC1信号)。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> 输出PWM原理:</span></span>
<span class="line"><span style="color: #768390"> 当计数器的值大于等于捕获/比较寄存器(CRR)的值时,输出逻辑为1,否则为0。</span></span>
<span class="line"><span style="color: #768390"> 那么我们通过设置计数周期以及重装载寄存器(ARR)的值就可以产生一个我们需要的波形。</span></span>
<span class="line"><span style="color: #768390"> ARR越大,周期越大、频率越小;CRR则与占空比相关,具体看计数器的计数方式。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">*/</span><span style="color: #ADBAC7"> </span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*------------------------PWM模式介绍------------------------*/</span></span>
<span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390"> PWM有两种模式。</span></span>
<span class="line"><span style="color: #768390"> PWM模式一:CNT&lt;CCR1是为有效电平(OC1REF=1),CNT&gt;=CR1是为无效电平(OC1REF=0)。</span></span>
<span class="line"><span style="color: #768390"> PWM模式二:与模式一相反。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*---------------输入捕获测量脉宽信号原理---------------*/</span></span>
<span class="line"><span style="color: #768390">/*</span></span>
<span class="line"><span style="color: #768390">简单来说就是通过两次捕获事件时计数器值之差,再加上这段时间内溢出事件的次数,就可以计算两次捕获事件的间隔时间。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">具体过程:捕获到一个沿上升沿检测事件后,计数器清零,同时把检测改成沿下降沿检测。记录溢出事件发生的次数,发生第二次捕获事件时再次读取计数器的值,计算。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">公式:T=(N*(ARR+1)+CRR)*(psc+1)/Ft;</span></span>
<span class="line"><span style="color: #768390"> T是持续时间,N为两次捕获事件期间的溢出次数,</span></span>
<span class="line"><span style="color: #768390"> ARR为重装载值,CRR是第二次捕获事件时计数器值,</span></span>
<span class="line"><span style="color: #768390"> psc是定时器预分频系数,Ft是定时器时钟源频率。</span></span>
<span class="line"><span style="color: #768390">*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef g_tim3_handle;</span><span style="color: #768390"> /* 定时器3句柄 */</span></span>
<span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef g_tim2_handle;</span><span style="color: #768390"> /* 定时器2句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 通用定时器TIMX定时中断初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz</span></span>
<span class="line"><span style="color: #768390"> * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.</span></span>
<span class="line"><span style="color: #768390"> * Ft=定时器工作频率,单位:Mhz</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">arr</span><span style="color: #768390">: 自动重装值。</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">psc</span><span style="color: #768390">: 时钟预分频数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_tim3_int_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_TIM3_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能TIMx时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_tim3_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM3;</span><span style="color: #768390"> /* 通用定时器x */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim3_handle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> psc;</span><span style="color: #768390"> /* 预分频系数 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim3_handle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span><span style="color: #768390"> /* 递增计数模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim3_handle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> arr;</span><span style="color: #768390"> /* 自动装载值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim3_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(TIM3_IRQn, </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 设置中断优先级,抢占优先级1,子优先级3 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(TIM3_IRQn);</span><span style="color: #768390"> /* 开启ITMx中断 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim3_handle);</span><span style="color: #768390"> /* 使能定时器x和定时器x更新中断 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_tim2_int_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_TIM2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能TIMx时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_tim2_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM2;</span><span style="color: #768390"> /* 通用定时器x */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim2_handle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> psc;</span><span style="color: #768390"> /* 预分频系数 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim2_handle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span><span style="color: #768390"> /* 递增计数模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_tim2_handle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> arr;</span><span style="color: #768390"> /* 自动装载值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim2_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(TIM2_IRQn, </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 设置中断优先级,抢占优先级1,子优先级3 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(TIM2_IRQn);</span><span style="color: #768390"> /* 开启ITMx中断 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Base_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim2_handle);</span><span style="color: #768390"> /* 使能定时器x和定时器x更新中断 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 定时器中断服务函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM3_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390"> /* 直接通过判断中断标志位的方式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim3_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//LED0_TOGGLE();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//HAL_TIM_IRQHandler(&amp;g_tim3_handle); /* 定时器中断公共处理函数,在btim.c里定义的 如果取消注释会看见0和1一起闪烁 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim3_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM2_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390"> /* 直接通过判断中断标志位的方式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim2_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//LED1_TOGGLE();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//HAL_TIM_IRQHandler(&amp;g_tim2_handle); </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim2_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*********************************以下是通用定时器PWM输出实验程序*************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef g_timx_pwm_chy_handle;</span><span style="color: #768390"> /* 定时器x句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 通用定时器TIMX 通道Y PWM输出 初始化函数(使用PWM模式1)</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz</span></span>
<span class="line"><span style="color: #768390"> * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.</span></span>
<span class="line"><span style="color: #768390"> * Ft=定时器工作频率,单位:Mhz</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">arr</span><span style="color: #768390">: 自动重装值。</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">psc</span><span style="color: #768390">: 时钟预分频数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_timx_pwm_chy_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_OC_InitTypeDef timx_oc_pwm_chy </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定时器PWM输出配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_pwm_chy_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GTIM_TIMX_PWM;</span><span style="color: #768390"> /* 定时器x */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_pwm_chy_handle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> psc;</span><span style="color: #768390"> /* 定时器分频 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_pwm_chy_handle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span><span style="color: #768390"> /* 递增计数模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_pwm_chy_handle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> arr;</span><span style="color: #768390"> /* 自动重装载值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_PWM_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_pwm_chy_handle);</span><span style="color: #768390"> /* 初始化PWM */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> timx_oc_pwm_chy.OCMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_OCMODE_PWM1;</span><span style="color: #768390"> /* 模式选择PWM1 */</span></span>
<span class="line"><span style="color: #ADBAC7"> timx_oc_pwm_chy.Pulse </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> arr </span><span style="color: #F47067">/</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 设置比较值,此值用来确定占空比 */</span></span>
<span class="line"><span style="color: #768390"> /* 默认比较值为自动重装载值的一半,即占空比为50% */</span></span>
<span class="line"><span style="color: #ADBAC7"> timx_oc_pwm_chy.OCPolarity </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_OCPOLARITY_HIGH;</span><span style="color: #768390"> /* 输出比较极性为高 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_PWM_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_pwm_chy_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">timx_oc_pwm_chy, GTIM_TIMX_PWM_CHY);</span><span style="color: #768390"> /* 配置TIMx通道y */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_PWM_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_pwm_chy_handle, GTIM_TIMX_PWM_CHY);</span><span style="color: #768390"> /* 开启对应PWM通道 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 定时器底层驱动,时钟使能,引脚配置</span></span>
<span class="line"><span style="color: #768390"> 此函数会被HAL_TIM_PWM_Init()调用</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">htim</span><span style="color: #768390">:定时器句柄</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_PWM_MspInit</span><span style="color: #ADBAC7">(TIM_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">htim</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (htim-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> GTIM_TIMX_PWM)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启通道y的CPIO时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GTIM_TIMX_PWM_CHY_GPIO_PIN;</span><span style="color: #768390"> /* 通道y的CPIO口 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_AF_PP;</span><span style="color: #768390"> /* 复用推完输出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLUP;</span><span style="color: #768390"> /* 上拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GTIM_TIMX_PWM_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_PWM_CHY_GPIO_REMAP</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* IO口REMAP设置, 是否必要查看头文件配置的说明 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*********************************通用定时器输入捕获实验程序*************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef g_timx_cap_chy_handle;</span><span style="color: #768390"> /* 定时器x句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 通用定时器TIMX 通道Y 输入捕获 初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候</span></span>
<span class="line"><span style="color: #768390"> * 通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz</span></span>
<span class="line"><span style="color: #768390"> * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.</span></span>
<span class="line"><span style="color: #768390"> * Ft=定时器工作频率,单位:Mhz</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">arr</span><span style="color: #768390">: 自动重装值</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">psc</span><span style="color: #768390">: 时钟预分频数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">gtim_timx_cap_chy_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">arr</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">psc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_IC_InitTypeDef timx_ic_cap_chy </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_cap_chy_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GTIM_TIMX_CAP;</span><span style="color: #768390"> /* 定时器5 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_cap_chy_handle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> psc;</span><span style="color: #768390"> /* 定时器分频 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_cap_chy_handle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span><span style="color: #768390"> /* 递增计数模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timx_cap_chy_handle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> arr;</span><span style="color: #768390"> /* 自动重装载值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> timx_ic_cap_chy.ICPolarity </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPOLARITY_RISING;</span><span style="color: #768390"> /* 上升沿捕获 一共有三种模式RISING、FALLING、BOTHEDGE */</span></span>
<span class="line"><span style="color: #ADBAC7"> timx_ic_cap_chy.ICSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICSELECTION_DIRECTTI;</span><span style="color: #768390"> /* 映射到TI1上,即映射到通道1上;一共有三种模式DIRECTTI、INDIRECTTITRC,即TI1、YI2、TRC */</span></span>
<span class="line"><span style="color: #ADBAC7"> timx_ic_cap_chy.ICPrescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPSC_DIV1;</span><span style="color: #768390"> /* 配置输入分频,不分频 可以设置为每2、4、8个事件触发一次捕获,吧1改成对应数字即可*/</span></span>
<span class="line"><span style="color: #ADBAC7"> timx_ic_cap_chy.ICFilter </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置输入滤波器,不滤波。这个值可以是0~16之间的整数,对应16个模式见捕获/比较模式寄存器1(TIMx_CCMR1)的位7:4 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">timx_ic_cap_chy, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 配置TIM5通道1 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_ENABLE_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 使能更新中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IC_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 开始捕获TIM5的通道1 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 通用定时器输入捕获初始化接口</span></span>
<span class="line"><span style="color: #768390"> HAL库调用的接口,用于配置不同的输入捕获</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">htim</span><span style="color: #768390">:定时器句柄</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 此函数会被HAL_TIM_IC_Init()调用</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IC_MspInit</span><span style="color: #ADBAC7">(TIM_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">htim</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (htim-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> GTIM_TIMX_CAP)</span><span style="color: #768390"> /*输入通道捕获*/</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能TIMx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启捕获IO的时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GTIM_TIMX_CAP_CHY_GPIO_PIN;</span><span style="color: #768390"> /* 输入捕获的GPIO口 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_AF_PP;</span><span style="color: #768390"> /* 复用推挽输出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLDOWN;</span><span style="color: #768390"> /* 下拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GTIM_TIMX_CAP_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(GTIM_TIMX_CAP_IRQn, </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 抢占1,子优先级3 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(GTIM_TIMX_CAP_IRQn);</span><span style="color: #768390"> /* 开启ITMx中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* 输入捕获状态(g_timxchy_cap_sta)</span></span>
<span class="line"><span style="color: #768390"> * &#91;7&#93; :0,没有成功的捕获;1,成功捕获到一次.</span></span>
<span class="line"><span style="color: #768390"> * &#91;6&#93; :0,还没捕获到高电平;1,已经捕获到高电平了.</span></span>
<span class="line"><span style="color: #768390"> * &#91;5:0&#93;:捕获高电平后溢出的次数,最多溢出63次,所以最长捕获值 = 63*65536 + 65535 = 4194303</span></span>
<span class="line"><span style="color: #768390"> * 注意:为了通用,我们默认ARR和CCRy都是16位寄存器,对于32位的定时器(如:TIM5),也只按16位使用</span></span>
<span class="line"><span style="color: #768390"> * 按1us的计数频率,最长溢出时间为:4194303 us, 约4.19秒</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * (说明一下:正常32位定时器来说,1us计数器加1,溢出时间:4294秒)</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> g_timxchy_cap_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 输入捕获状态 */</span></span>
<span class="line"><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> g_timxchy_cap_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 输入捕获值 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 定时器中断服务函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GTIM_TIMX_CAP_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle);</span><span style="color: #768390"> /* 定时器HAL库共用处理函数 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 定时器输入捕获中断处理回调函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">htim</span><span style="color: #768390">:定时器句柄指针</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 该函数在HAL_TIM_IRQHandler中会被调用</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_IC_CaptureCallback</span><span style="color: #ADBAC7">(TIM_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">htim</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{ </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (htim-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> GTIM_TIMX_CAP)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED1_TOGGLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((g_timxchy_cap_sta </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">80</span><span style="color: #ADBAC7">) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 还未成功捕获(第7位为0)(即上一次捕获还未完成) */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (g_timxchy_cap_sta </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 已经捕获过上升沿了,这次捕获到的是一个下降沿(第6位为1) */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_sta </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">80</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 标记成功捕获到一次高电平脉宽 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_ReadCapturedValue</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 获取当前的捕获值 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_RESET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 一定要先清除原来的设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_SET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);</span><span style="color: #768390"> /* 配置TIM5通道1上升沿捕获 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span><span style="color: #768390"> /* 还未开始,第一次捕获上升沿 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 清空 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_sta </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 标记捕获到了上升沿 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_SET_COUNTER</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 定时器5计数器清零 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_RESET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 一定要先清除原来的设置!! */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_SET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_FALLING);</span><span style="color: #768390"> /* 定时器5通道1设置为下降沿捕获 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 定时器更新中断回调函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">htim</span><span style="color: #768390">:定时器句柄指针</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 此函数会被定时器中断函数共同调用的</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_PeriodElapsedCallback</span><span style="color: #ADBAC7">(TIM_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">htim</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (htim-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> GTIM_TIMX_CAP)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((g_timxchy_cap_sta </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">80</span><span style="color: #ADBAC7">) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 还未成功捕获 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (g_timxchy_cap_sta </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 已经捕获到高电平了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((g_timxchy_cap_sta </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">3F</span><span style="color: #ADBAC7">) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">3F</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 高电平太长了,已经累计满了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_RESET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY);</span><span style="color: #768390"> /* 一定要先清除原来的设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM_SET_CAPTUREPOLARITY</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_timx_cap_chy_handle, GTIM_TIMX_CAP_CHY, TIM_ICPOLARITY_RISING);</span><span style="color: #768390">/* 配置TIM5通道1上升沿捕获 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_sta </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">80</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 标记成功捕获了一次 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">0X</span><span style="color: #6CB6FF">FFFF</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span><span style="color: #768390"> /* 累计定时器溢出次数 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> g_timxchy_cap_sta</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="dN6FI">电机编码器(TIM3)</h3>
<!-- /wp:heading -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"#ifndef __ENCODER_H\n#define __ENCODER_H\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n\n#define ENCODER_TIM TIM3\n#define ENCODER_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()\n#define ENCODER_TIM_PERIOD 65535 /* 定时器溢出值 */\n\n#define ENCODER_TIM_PRESCALER 0 /* 定时器预分频值 */\n/* 定时器3中断TIM3_IRQn、TIM3_IRQHandler在gtim里,不过没用到 */\n\nvoid Encoder_Init(void);\nint16_t Encoder_Get(void);\n\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ENCODER_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ENCODER_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eENCODER_TIM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eENCODER_TIM_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_TIM3_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eENCODER_TIM_PERIOD\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e65535\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器溢出值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eENCODER_TIM_PRESCALER\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器预分频值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 定时器3中断TIM3_IRQn、TIM3_IRQHandler在gtim里,不过没用到 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":17,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef __ENCODER_H
#define __ENCODER_H
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"

#define ENCODER_TIM TIM3
#define ENCODER_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()
#define ENCODER_TIM_PERIOD 65535 /* 定时器溢出值 */

#define ENCODER_TIM_PRESCALER 0 /* 定时器预分频值 */
/* 定时器3中断TIM3_IRQn、TIM3_IRQHandler在gtim里,不过没用到 */

void Encoder_Init(void);
int16_t Encoder_Get(void);

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ENCODER_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ENCODER_H</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ENCODER_TIM</span><span style="color: #ADBAC7"> TIM3</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ENCODER_TIM_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #DCBDFB">__HAL_RCC_TIM3_CLK_ENABLE</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ENCODER_TIM_PERIOD</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">65535</span><span style="color: #768390"> /* 定时器溢出值 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ENCODER_TIM_PRESCALER</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #768390"> /* 定时器预分频值 */</span></span>
<span class="line"><span style="color: #768390">/* 定时器3中断TIM3_IRQn、TIM3_IRQHandler在gtim里,不过没用到 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022stm32f10x.h\u0022 // Device header\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n/**\n * 函 数:编码器初始化\n * 参 数:无\n * 返 回 值:无\n */\nTIM_Encoder_InitTypeDef Encoder_ConfigStructure;\nTIM_HandleTypeDef TIM_EncoderHandle; /* 定时器3句柄 */\n\nvoid Encoder_Init(void)\n{\n /*开启时钟*/\n __HAL_RCC_GPIOB_CLK_ENABLE();\n\n /*GPIO初始化*/\n GPIO_InitTypeDef gpio_init_struct;\n gpio_init_struct.Pin = GPIO_PIN_6; /* 引脚 */\n gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输出 */\n gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */\n gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */\n //gpio_init_struct.Alternate = ENCODER_TIM_CH1_GPIO_AF; /* 设置复用 */\n HAL_GPIO_Init(GPIOA, \u0026gpio_init_struct); /* 初始化引脚 */\n\n gpio_init_struct.Pin = GPIO_PIN_7; /* 引脚 */\n //gpio_init_struct.Alternate = ENCODER_TIM_CH2_GPIO_AF; /* 设置复用 */\n HAL_GPIO_Init(GPIOA, \u0026gpio_init_struct); /* 初始化引脚 */\n //将PA6和PA7引脚初始化为上拉输入\n\n /*时基单元初始化*/\n ENCODER_TIM_CLK_ENABLE();\n TIM_EncoderHandle.Instance = ENCODER_TIM;\n TIM_EncoderHandle.Init.Prescaler = ENCODER_TIM_PRESCALER;\n TIM_EncoderHandle.Init.CounterMode = TIM_COUNTERMODE_UP;\n TIM_EncoderHandle.Init.Period = ENCODER_TIM_PERIOD;\n TIM_EncoderHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n TIM_EncoderHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\n\n /* 设置编码器倍频数 */\n Encoder_ConfigStructure.EncoderMode = TIM_ENCODERMODE_TI12;\n /* 编码器接口通道1设置 */\n Encoder_ConfigStructure.IC1Polarity = TIM_ICPOLARITY_RISING;\n Encoder_ConfigStructure.IC1Selection = TIM_ICSELECTION_DIRECTTI;\n Encoder_ConfigStructure.IC1Prescaler = TIM_ICPSC_DIV1;\n Encoder_ConfigStructure.IC1Filter = 0;\n /* 编码器接口通道2设置 */\n Encoder_ConfigStructure.IC2Polarity = TIM_ICPOLARITY_FALLING;\n Encoder_ConfigStructure.IC2Selection = TIM_ICSELECTION_DIRECTTI;\n Encoder_ConfigStructure.IC2Prescaler = TIM_ICPSC_DIV1;\n Encoder_ConfigStructure.IC2Filter = 0;\n /* 初始化编码器接口 */\n HAL_TIM_Encoder_Init(\u0026TIM_EncoderHandle, \u0026Encoder_ConfigStructure);\n\n /* 清零计数器 */\n __HAL_TIM_SET_COUNTER(\u0026TIM_EncoderHandle, ENCODER_TIM_PERIOD/2);\n\n /* 清零中断标志位 */\n __HAL_TIM_CLEAR_IT(\u0026TIM_EncoderHandle,TIM_IT_UPDATE);\n /* 使能定时器的更新事件中断 */\n __HAL_TIM_ENABLE_IT(\u0026TIM_EncoderHandle,TIM_IT_UPDATE);\n /* 设置更新事件请求源为:定时器溢出 */\n __HAL_TIM_URS_ENABLE(\u0026TIM_EncoderHandle);\n\n /* 设置中断优先级 */\n HAL_NVIC_SetPriority(TIM3_IRQn, 5, 1);\n /* 使能定时器中断 */\n HAL_NVIC_EnableIRQ(TIM3_IRQn);\n\n /* 使能编码器接口 */\n HAL_TIM_Encoder_Start(\u0026TIM_EncoderHandle, TIM_CHANNEL_ALL);\n\n}\n\n/**\n * 函 数:获取编码器的增量值\n * 参 数:无\n * 返 回 值:自上此调用此函数后,编码器的增量值\n */\nint16_t Encoder_Get(void)\n{\n /*使用Temp变量作为中继,目的是返回CNT后将其清零*/\n int16_t Temp;\n Temp = __HAL_TIM_GetCounter(\u0026TIM_EncoderHandle)-ENCODER_TIM_PERIOD/2;\n __HAL_TIM_SetCounter(\u0026TIM_EncoderHandle, ENCODER_TIM_PERIOD/2);\n return Temp;\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;stm32f10x.h\u0026quot; // Device header\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 函 数:编码器初始化\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 参 数:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 返 回 值:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_Encoder_InitTypeDef Encoder_ConfigStructure;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_HandleTypeDef TIM_EncoderHandle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定时器3句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*开启时钟*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOB_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*GPIO初始化*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_INPUT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 输出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pull \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PULLUP;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 上拉 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_SPEED_FREQ_HIGH;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 高速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//gpio_init_struct.Alternate = ENCODER_TIM_CH1_GPIO_AF; /* 设置复用 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_7;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//gpio_init_struct.Alternate = ENCODER_TIM_CH2_GPIO_AF; /* 设置复用 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//将PA6和PA7引脚初始化为上拉输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*时基单元初始化*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eENCODER_TIM_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENCODER_TIM;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Init.Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENCODER_TIM_PRESCALER;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Init.CounterMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_COUNTERMODE_UP;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Init.Period \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENCODER_TIM_PERIOD;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Init.ClockDivision \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_CLOCKDIVISION_DIV1;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_EncoderHandle.Init.AutoReloadPreload \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_AUTORELOAD_PRELOAD_DISABLE;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置编码器倍频数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.EncoderMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ENCODERMODE_TI12;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 编码器接口通道1设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC1Polarity \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPOLARITY_RISING;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC1Selection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICSELECTION_DIRECTTI;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC1Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPSC_DIV1;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC1Filter \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 编码器接口通道2设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC2Polarity \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPOLARITY_FALLING;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC2Selection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICSELECTION_DIRECTTI;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC2Prescaler \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e TIM_ICPSC_DIV1;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Encoder_ConfigStructure.IC2Filter \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化编码器接口 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Encoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eEncoder_ConfigStructure);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清零计数器 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_SET_COUNTER\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle, ENCODER_TIM_PERIOD\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清零中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle,TIM_IT_UPDATE);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能定时器的更新事件中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_ENABLE_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle,TIM_IT_UPDATE);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置更新事件请求源为:定时器溢出 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_URS_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置中断优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM3_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能定时器中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(TIM3_IRQn);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能编码器接口 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_TIM_Encoder_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle, TIM_CHANNEL_ALL);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 函 数:获取编码器的增量值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 参 数:无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 返 回 值:自上此调用此函数后,编码器的增量值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*使用Temp变量作为中继,目的是返回CNT后将其清零*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GetCounter\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eENCODER_TIM_PERIOD\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_SetCounter\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eTIM_EncoderHandle, ENCODER_TIM_PERIOD\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Temp;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":87,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "stm32f10x.h" // Device header
#include "./BSP/Encoder/Encoder.h"
/**
* 函 数:编码器初始化
* 参 数:无
* 返 回 值:无
*/
TIM_Encoder_InitTypeDef Encoder_ConfigStructure;
TIM_HandleTypeDef TIM_EncoderHandle; /* 定时器3句柄 */

void Encoder_Init(void)
{
/*开启时钟*/
__HAL_RCC_GPIOB_CLK_ENABLE();

/*GPIO初始化*/
GPIO_InitTypeDef gpio_init_struct;
gpio_init_struct.Pin = GPIO_PIN_6; /* 引脚 */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
//gpio_init_struct.Alternate = ENCODER_TIM_CH1_GPIO_AF; /* 设置复用 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct); /* 初始化引脚 */

gpio_init_struct.Pin = GPIO_PIN_7; /* 引脚 */
//gpio_init_struct.Alternate = ENCODER_TIM_CH2_GPIO_AF; /* 设置复用 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct); /* 初始化引脚 */
//将PA6和PA7引脚初始化为上拉输入

/*时基单元初始化*/
ENCODER_TIM_CLK_ENABLE();
TIM_EncoderHandle.Instance = ENCODER_TIM;
TIM_EncoderHandle.Init.Prescaler = ENCODER_TIM_PRESCALER;
TIM_EncoderHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_EncoderHandle.Init.Period = ENCODER_TIM_PERIOD;
TIM_EncoderHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TIM_EncoderHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

/* 设置编码器倍频数 */
Encoder_ConfigStructure.EncoderMode = TIM_ENCODERMODE_TI12;
/* 编码器接口通道1设置 */
Encoder_ConfigStructure.IC1Polarity = TIM_ICPOLARITY_RISING;
Encoder_ConfigStructure.IC1Selection = TIM_ICSELECTION_DIRECTTI;
Encoder_ConfigStructure.IC1Prescaler = TIM_ICPSC_DIV1;
Encoder_ConfigStructure.IC1Filter = 0;
/* 编码器接口通道2设置 */
Encoder_ConfigStructure.IC2Polarity = TIM_ICPOLARITY_FALLING;
Encoder_ConfigStructure.IC2Selection = TIM_ICSELECTION_DIRECTTI;
Encoder_ConfigStructure.IC2Prescaler = TIM_ICPSC_DIV1;
Encoder_ConfigStructure.IC2Filter = 0;
/* 初始化编码器接口 */
HAL_TIM_Encoder_Init(&amp;TIM_EncoderHandle, &amp;Encoder_ConfigStructure);

/* 清零计数器 */
__HAL_TIM_SET_COUNTER(&amp;TIM_EncoderHandle, ENCODER_TIM_PERIOD/2);

/* 清零中断标志位 */
__HAL_TIM_CLEAR_IT(&amp;TIM_EncoderHandle,TIM_IT_UPDATE);
/* 使能定时器的更新事件中断 */
__HAL_TIM_ENABLE_IT(&amp;TIM_EncoderHandle,TIM_IT_UPDATE);
/* 设置更新事件请求源为:定时器溢出 */
__HAL_TIM_URS_ENABLE(&amp;TIM_EncoderHandle);

/* 设置中断优先级 */
HAL_NVIC_SetPriority(TIM3_IRQn, 5, 1);
/* 使能定时器中断 */
HAL_NVIC_EnableIRQ(TIM3_IRQn);

/* 使能编码器接口 */
HAL_TIM_Encoder_Start(&amp;TIM_EncoderHandle, TIM_CHANNEL_ALL);

}

/**
* 函 数:获取编码器的增量值
* 参 数:无
* 返 回 值:自上此调用此函数后,编码器的增量值
*/
int16_t Encoder_Get(void)
{
/*使用Temp变量作为中继,目的是返回CNT后将其清零*/
int16_t Temp;
Temp = __HAL_TIM_GetCounter(&amp;TIM_EncoderHandle)-ENCODER_TIM_PERIOD/2;
__HAL_TIM_SetCounter(&amp;TIM_EncoderHandle, ENCODER_TIM_PERIOD/2);
return Temp;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;stm32f10x.h&quot; // Device header</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * 函 数:编码器初始化</span></span>
<span class="line"><span style="color: #768390"> * 参 数:无</span></span>
<span class="line"><span style="color: #768390"> * 返 回 值:无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #ADBAC7">TIM_Encoder_InitTypeDef Encoder_ConfigStructure;</span></span>
<span class="line"><span style="color: #ADBAC7">TIM_HandleTypeDef TIM_EncoderHandle;</span><span style="color: #768390"> /* 定时器3句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390"> /*开启时钟*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*GPIO初始化*/</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_6;</span><span style="color: #768390"> /* 引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_INPUT;</span><span style="color: #768390"> /* 输出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pull </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PULLUP;</span><span style="color: #768390"> /* 上拉 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_SPEED_FREQ_HIGH;</span><span style="color: #768390"> /* 高速 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//gpio_init_struct.Alternate = ENCODER_TIM_CH1_GPIO_AF; /* 设置复用 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* 初始化引脚 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_7;</span><span style="color: #768390"> /* 引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//gpio_init_struct.Alternate = ENCODER_TIM_CH2_GPIO_AF; /* 设置复用 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span><span style="color: #768390"> /* 初始化引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//将PA6和PA7引脚初始化为上拉输入</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*时基单元初始化*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ENCODER_TIM_CLK_ENABLE</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENCODER_TIM;</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Init.Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENCODER_TIM_PRESCALER;</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Init.CounterMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_COUNTERMODE_UP;</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Init.Period </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENCODER_TIM_PERIOD;</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Init.ClockDivision </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_CLOCKDIVISION_DIV1;</span></span>
<span class="line"><span style="color: #ADBAC7"> TIM_EncoderHandle.Init.AutoReloadPreload </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_AUTORELOAD_PRELOAD_DISABLE;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置编码器倍频数 */</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.EncoderMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ENCODERMODE_TI12;</span></span>
<span class="line"><span style="color: #768390"> /* 编码器接口通道1设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC1Polarity </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPOLARITY_RISING;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC1Selection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICSELECTION_DIRECTTI;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC1Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPSC_DIV1;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC1Filter </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #768390"> /* 编码器接口通道2设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC2Polarity </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPOLARITY_FALLING;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC2Selection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICSELECTION_DIRECTTI;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC2Prescaler </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> TIM_ICPSC_DIV1;</span></span>
<span class="line"><span style="color: #ADBAC7"> Encoder_ConfigStructure.IC2Filter </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #768390"> /* 初始化编码器接口 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Encoder_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">Encoder_ConfigStructure);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 清零计数器 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_SET_COUNTER</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle, ENCODER_TIM_PERIOD</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 清零中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle,TIM_IT_UPDATE);</span></span>
<span class="line"><span style="color: #768390"> /* 使能定时器的更新事件中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_ENABLE_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle,TIM_IT_UPDATE);</span></span>
<span class="line"><span style="color: #768390"> /* 设置更新事件请求源为:定时器溢出 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_URS_ENABLE</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置中断优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(TIM3_IRQn, </span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #768390"> /* 使能定时器中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(TIM3_IRQn);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 使能编码器接口 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_TIM_Encoder_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle, TIM_CHANNEL_ALL);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * 函 数:获取编码器的增量值</span></span>
<span class="line"><span style="color: #768390"> * 参 数:无</span></span>
<span class="line"><span style="color: #768390"> * 返 回 值:自上此调用此函数后,编码器的增量值</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390"> /*使用Temp变量作为中继,目的是返回CNT后将其清零*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> Temp;</span></span>
<span class="line"><span style="color: #ADBAC7"> Temp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_GetCounter</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle)</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">ENCODER_TIM_PERIOD</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_SetCounter</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">TIM_EncoderHandle, ENCODER_TIM_PERIOD</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> Temp;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:paragraph -->
<p>需要注意的是江协在读取完编码器之后将计数器归零;但我在实际使用后发现这样会导致编码器只能朝一个方向转,反方向转时会导致定时器卡死。所以我重置值使用的是计数器最大值的一半。如果你没有这种问题,建议改回0 。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="ah9Ag">PID闭环控制实验(定速)</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1749973534910-5a8d5fd7-a404-4543-abce-be25c4b3a02e.docx">01PID_Closed_loop_Control(speed).docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br> 对于编码器读取周期,有如下几点:</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,205,0.44) 3%,rgba(81,112,224,0.51) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,205,0.44) 3%,rgba(81,112,224,0.51) 100%)"><!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>编码器读取间隔越长,受波动影响越小,测速越准确;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>编码器周期不宜过长,防止PID调整后更新不及时;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>编码器周期不宜过短,会造成中间读取的数据被浪费。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>所以,答案只有一个:编码器的周期应和PID调控周期保持一致。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,160,0.43) 0%,rgba(81,136,224,0.49) 99%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,160,0.43) 0%,rgba(81,136,224,0.49) 99%)"><!-- wp:paragraph -->
<p> 由于前期项目的调控过程都是在定时器中断里实现的,因此我们可以直接把定时器中断移动到main.c里。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\nfloat Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值\nfloat Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重\nfloat Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n //extix_init();\n //toggle_exit_bool();\n\n OLED_Init();\n\n LED_ON();\n\n Timer_Init();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n key_v+=60;\n break;\n case 2:\n key_v-=60;\n break;\n case 3:\n key_v=0;\n break;\n case 4:\n key_v=-key_v;\n break;\n }\n\n Kp = RP_GetValue(1)/4095.0*20;\n Ki = RP_GetValue(2)/4095.0*20;\n Kd = RP_GetValue(3)/4095.0*20;\n //Target = RP_GetValue(4)/4095.0*260 - 130 + key_v;\n Target = key_v;\n\n OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,RP_GetValue(1));\n OLED_Printf(0,8,OLED_6X8,\u0022TAR:%+04.0f\u0022,Target);\n OLED_Printf(0,16,OLED_6X8,\u0022ACT:%+04.0f\u0022,Actual);\n OLED_Printf(0,24,OLED_6X8,\u0022OUT:%+04.0f\u0022,Out);\n OLED_Printf(0,32,OLED_6X8,\u0022EINT:%+04.0f\u0022,ErrorInt);\n\n OLED_Printf(60,0,OLED_6X8,\u0022P:%02.1f\u0022,Kp);\n OLED_Printf(60,8,OLED_6X8,\u0022I:%02.1f\u0022,Ki);\n OLED_Printf(60,16,OLED_6X8,\u0022D:%02.1f\u0022,Kd);\n\n my_USART_printf(1,\u0022%.0f,%.0fn\u0022,Target,Actual);\n //OLED_ReverseArea(0,0,54,63);\n OLED_Reverse();\n //OLED_Update();\n\n //Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);\n //Motor_SetPWM(Target);\n //my_USART_printf(1,\u0022%d,%d,%d,%dn\u0022,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));\n\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count\u003e20){\n count=0;\n OLED_Update();\n\n //speed = Encoder_Get();\n //location+=speed;\n\n Actual = Encoder_Get();\n Error1 = Error0;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n ErrorInt += Error0;\n /*积分限幅*/\n if(ErrorInt \u003e 600){ErrorInt = 600;}\n if(ErrorInt \u003c -600){ErrorInt = -600;}\n\n /*PID计算*/\n Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n /*输岀限幅*/\n if(Out \u003e 1000){Out = 1000;}\n if(Out \u003c -1000){Out = -1000;}\n\n /*执行控制*/\n Motor_SetPWM(Out);\n\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标值,实际值,输出值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0, Error1, ErrorInt;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,误差积分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//extix_init();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//toggle_exit_bool();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ekey_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Target = RP_GetValue(4)/4095.0*260 - 130 + key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;TAR:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ACT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;OUT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;EINT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,ErrorInt);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target,Actual);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_ReverseArea(0,0,54,63);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM(Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//my_USART_printf(1,\u0026quot;%d,%d,%d,%dn\u0026quot;,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//speed = Encoder_Get();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//location+=speed;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":140,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"

//当前电机速度和位置
int16_t speed=0,location=0;
float Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值
float Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重
float Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

//extix_init();
//toggle_exit_bool();

OLED_Init();

LED_ON();

Timer_Init();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);
while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
key_v+=60;
break;
case 2:
key_v-=60;
break;
case 3:
key_v=0;
break;
case 4:
key_v=-key_v;
break;
}

Kp = RP_GetValue(1)/4095.0*20;
Ki = RP_GetValue(2)/4095.0*20;
Kd = RP_GetValue(3)/4095.0*20;
//Target = RP_GetValue(4)/4095.0*260 - 130 + key_v;
Target = key_v;

OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",RP_GetValue(1));
OLED_Printf(0,8,OLED_6X8,"TAR:%+04.0f",Target);
OLED_Printf(0,16,OLED_6X8,"ACT:%+04.0f",Actual);
OLED_Printf(0,24,OLED_6X8,"OUT:%+04.0f",Out);
OLED_Printf(0,32,OLED_6X8,"EINT:%+04.0f",ErrorInt);

OLED_Printf(60,0,OLED_6X8,"P:%02.1f",Kp);
OLED_Printf(60,8,OLED_6X8,"I:%02.1f",Ki);
OLED_Printf(60,16,OLED_6X8,"D:%02.1f",Kd);

my_USART_printf(1,"%.0f,%.0fn",Target,Actual);
//OLED_ReverseArea(0,0,54,63);
OLED_Reverse();
//OLED_Update();

//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);
//Motor_SetPWM(Target);
//my_USART_printf(1,"%d,%d,%d,%dn",RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));

delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count>20){
count=0;
OLED_Update();

//speed = Encoder_Get();
//location+=speed;

Actual = Encoder_Get();
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;
/*积分限幅*/
if(ErrorInt > 600){ErrorInt = 600;}
if(ErrorInt &lt; -600){ErrorInt = -600;}

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);

}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //目标值,实际值,输出值</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">,Ki </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">,Kd</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0.3</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error0, Error1, ErrorInt;</span><span style="color: #768390"> //本次误差,上次误差,误差积分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//extix_init();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//toggle_exit_bool();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=-</span><span style="color: #ADBAC7">key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Target = RP_GetValue(4)/4095.0*260 - 130 + key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> key_v;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,</span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">));</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;TAR:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ACT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Actual);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;OUT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;EINT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,ErrorInt);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kd);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,Target,Actual);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_ReverseArea(0,0,54,63);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM(Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//my_USART_printf(1,&quot;%d,%d,%d,%dn&quot;,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//speed = Encoder_Get();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//location+=speed;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #768390"> /*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(22deg,rgba(7,146,227,0.49) 0%,rgba(155,81,224,0.54) 99%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(22deg,rgba(7,146,227,0.49) 0%,rgba(155,81,224,0.54) 99%)"><!-- wp:paragraph -->
<p>如果遇到明明target很小电机却满速转的情况,可能是电机驱动方向或编码器极性设置反了。把两个里任意一个改反即可。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果要改编码器方向,将第44行<font style="color:#ECAA04;">或</font>49行的RISING、FALLING转换即可。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="wYsyq">PID调参</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>PID一般按照P、I、D的顺序调参。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>一般来说,P、I、D的<font style="color:#DF2A3F;">数量级与输入输出的比值相关</font>。对于我们来说,Actual的范围是±140(如果你设置的读取周期不同,那么这个值也会不同,以你实测电机满转速时的读取值为准),但我们的输出范围是±1000(也以你TIM2设置的重装载值和电机驱动的参数为准)输出比输入大了一个数量级,因此我们的PID参数也应该在10这一数量级左右。(如果大两个,那就是100,相同就是1)。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>根据江协的调参过程,我们应:</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>使用串口将目标值、实际值打印到电脑上,通过SerialPlot软件接收、绘图;另将KI、KP、KD打印到OLED上方便观察。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>首先将KP、KI、KD都归零,然后设置一个较大的目标值;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>逐渐增大KP,直到系统出现抖动;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>减小KP使系统不至于抖动,KI增大一个很小的值,然后迅速变化目标值,观察曲线变化;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>逐渐增大KI,直到你对两条曲线的贴合程度满意为止。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>观察曲线变化过程,如果发现曲线经常一头“扎过”目标值(即过调),则适当增加KD,使过调消失。如果没有这种倾向,保持KD为0。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(0,77,113,0.4) 2%,rgba(60,29,87,0.55) 99%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(0,77,113,0.4) 2%,rgba(60,29,87,0.55) 99%)"><!-- wp:paragraph {"fontSize":"medium"} -->
<p class="has-medium-font-size">正常情况下,参数越大,反应越迅速,但更容易出现抖动过冲等现象;参数越小,调控越缓慢,但调控过程也越平滑</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"fontSize":"medium"} -->
<p class="has-medium-font-size">我调完参后发现PID分别为5、4、0左右时效果最好效果如图。波形是手按按键反转目标值得到的,平均每秒反转1.5次。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1024,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID16-1024x469.webp" alt="" class="wp-image-1024"/></figure>
<!-- /wp:image --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="r8eo9">积分饱和</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在“位置式PID实现”的末尾,我们提了一嘴输出限幅和积分限幅。输出限幅是为了是PID给出的参数合法,那么积分限幅呢?</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(12,118,6,0.36) 4%,rgba(142,150,51,0.49) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(12,118,6,0.36) 4%,rgba(142,150,51,0.49) 100%)"><!-- wp:paragraph -->
<p><br> 在此之前,我们不妨设想一下这样的情景:电机的最大转速为140,但我们的目标值设定在了180。这种情况下,由于实际速度永远达不到目标速度,就会导致ErrorInt<font style="color:#C99103;">不停</font>增大!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果在这时,我们突然对目标值取相反数会怎么样?由于误差积分已经累积到一个很庞大的值,积分项的输出盖过了其它两项的输出,导致系统迟迟给不出合适的反应(也就是滞后性),直到误差积分重新接近合适的值才会“幡然醒悟”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Q:为什么积分饱和后过一段时间会自行消除?</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A:回到刚才的情景:我们目标值为180,实际值为140,误差为+40,因此误差积分会持续变大。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>然后我们反转目标值,变成-180,此时实际值依然为140,误差为-320,所以误差积分会变小,直到误差维持在0左右才不变。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>上面的例子就说明了对积分进行限制是一件多么必要的事。它可以让系统兼具对稳态误差的弥补功能和对目标值变化的快速反应。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>对于积分应该限制在什么范围内也是需要测量的。就作者而言,将目标值设定在一个接近最大转速的值上,观察此时积分的大小;然后将目标值取反,再次观察积分的大小。这两次观察的范围就是我们积分项所需要的范围了。不过为了留有余地,建议在这个范围上扩大一点。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如:根据我实际测量,发现积分始终处于270~-270之间,那么我们可以将积分限制在±500这个范围内(不能理解为乘2,而是加200)。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>更多描述见下文"<a href="#gpciy">PID算法改进-积分限幅</a>"</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="pUvKP">增量式PID</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>对照上文修改一下变量声明和输出公式就行,不做赘述。<font style="color:#ECAA04;">具体过程可从视频[1-4]节34分钟处查看。</font></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="ebQhr">PID闭环控制(定位)<br> </h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1749978060114-40e8fb87-2d54-4550-a48c-53c7975aa5c7.docx">02PID_Closed_loop_Control(location).docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\nfloat Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值\nfloat Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重\nfloat Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n //extix_init();\n //toggle_exit_bool();\n\n OLED_Init();\n\n LED_ON();\n\n Timer_Init();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n key_v+=204;\n break;\n case 2:\n key_v-=204;\n break;\n case 3:\n key_v=0;\n break;\n case 4:\n key_v=-key_v;\n break;\n }\n\n Kp = RP_GetValue(1)/4095.0*20;\n Ki = RP_GetValue(2)/4095.0*20;\n Kd = RP_GetValue(3)/4095.0*20;\n Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;\n //Target = key_v;\n\n OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,RP_GetValue(1));\n OLED_Printf(0,8,OLED_6X8,\u0022TAR:%+04.0f\u0022,Target);\n OLED_Printf(0,16,OLED_6X8,\u0022ACT:%+04.0f\u0022,Actual);\n OLED_Printf(0,24,OLED_6X8,\u0022OUT:%+04.0f\u0022,Out);\n OLED_Printf(0,32,OLED_6X8,\u0022EINT:%+04.0f\u0022,ErrorInt);\n\n OLED_Printf(60,0,OLED_6X8,\u0022P:%02.1f\u0022,Kp);\n OLED_Printf(60,8,OLED_6X8,\u0022I:%02.1f\u0022,Ki);\n OLED_Printf(60,16,OLED_6X8,\u0022D:%02.1f\u0022,Kd);\n\n my_USART_printf(1,\u0022%.0f,%.0f,%.0fn\u0022,Target,Actual,Out);\n //OLED_ReverseArea(0,0,54,63);\n OLED_Reverse();\n //OLED_Update();\n\n //Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);\n //Motor_SetPWM(Target);\n //my_USART_printf(1,\u0022%d,%d,%d,%dn\u0022,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));\n\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count\u003e20){\n count=0;\n OLED_Update();\n\n speed = Encoder_Get();\n location+=speed;\n\n Actual = location;\n Error1 = Error0;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n ErrorInt += Error0;\n /*积分限幅*/\n if(ErrorInt \u003e 600){ErrorInt = 600;}\n if(ErrorInt \u003c -600){ErrorInt = -600;}\n\n /*PID计算*/\n Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n /*输岀限幅*/\n if(Out \u003e 1000){Out = 1000;}\n if(Out \u003c -1000){Out = -1000;}\n\n /*执行控制*/\n Motor_SetPWM(Out);\n\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标值,实际值,输出值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0, Error1, ErrorInt;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,误差积分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//extix_init();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//toggle_exit_bool();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ekey_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1832\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e916\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Target = key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;TAR:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ACT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;OUT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;EINT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,ErrorInt);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target,Actual,Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_ReverseArea(0,0,54,63);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM(Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//my_USART_printf(1,\u0026quot;%d,%d,%d,%dn\u0026quot;,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003espeed;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":140,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"

//当前电机速度和位置
int16_t speed=0,location=0;
float Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值
float Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重
float Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

//extix_init();
//toggle_exit_bool();

OLED_Init();

LED_ON();

Timer_Init();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);
while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
key_v+=204;
break;
case 2:
key_v-=204;
break;
case 3:
key_v=0;
break;
case 4:
key_v=-key_v;
break;
}

Kp = RP_GetValue(1)/4095.0*20;
Ki = RP_GetValue(2)/4095.0*20;
Kd = RP_GetValue(3)/4095.0*20;
Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;
//Target = key_v;

OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",RP_GetValue(1));
OLED_Printf(0,8,OLED_6X8,"TAR:%+04.0f",Target);
OLED_Printf(0,16,OLED_6X8,"ACT:%+04.0f",Actual);
OLED_Printf(0,24,OLED_6X8,"OUT:%+04.0f",Out);
OLED_Printf(0,32,OLED_6X8,"EINT:%+04.0f",ErrorInt);

OLED_Printf(60,0,OLED_6X8,"P:%02.1f",Kp);
OLED_Printf(60,8,OLED_6X8,"I:%02.1f",Ki);
OLED_Printf(60,16,OLED_6X8,"D:%02.1f",Kd);

my_USART_printf(1,"%.0f,%.0f,%.0fn",Target,Actual,Out);
//OLED_ReverseArea(0,0,54,63);
OLED_Reverse();
//OLED_Update();

//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);
//Motor_SetPWM(Target);
//my_USART_printf(1,"%d,%d,%d,%dn",RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));

delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count>20){
count=0;
OLED_Update();

speed = Encoder_Get();
location+=speed;

Actual = location;
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;
/*积分限幅*/
if(ErrorInt > 600){ErrorInt = 600;}
if(ErrorInt &lt; -600){ErrorInt = -600;}

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);

}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //目标值,实际值,输出值</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">,Ki </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">,Kd</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0.3</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error0, Error1, ErrorInt;</span><span style="color: #768390"> //本次误差,上次误差,误差积分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//extix_init();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//toggle_exit_bool();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=-</span><span style="color: #ADBAC7">key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">1832</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">916</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Target = key_v;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,</span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">));</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;TAR:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ACT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Actual);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;OUT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;EINT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,ErrorInt);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kd);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,Target,Actual,Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_ReverseArea(0,0,54,63);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM((RP_GetValue(1)/4095.0)*2000-1000+Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM(Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//my_USART_printf(1,&quot;%d,%d,%d,%dn&quot;,RP_GetValue(1),RP_GetValue(2),RP_GetValue(3),RP_GetValue(4));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">speed;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> location;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #768390"> /*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(311deg,rgba(7,146,227,0.35) 0%,rgba(155,81,224,0.31) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(311deg,rgba(7,146,227,0.35) 0%,rgba(155,81,224,0.31) 100%)"><!-- wp:paragraph -->
<p>只不过是把Actual和Target的值替换为位置而已,没什么好讲的。<br> 不过我发现在电机位置的控制中,KI项会大大增加过冲幅度,却对于削减稳定误差没什么帮助(因为电机处于平放状态下,没有外力作用,<font style="color:#FBDE28;">自然条件下就倾向于维持位置不变,因此该系统没有稳态误差</font>;若电机连接轮子并且放在斜面上,就会存在稳态误差了),因此我将KI项置0 。(这个问题可以用<a href="#KaBJb">积分分离</a>来解决)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>江协在视频中提到了另一种观点:有时由于out值过小,不足以驱动电机旋转,导致电机实际位置可能会与目标位置有一点微小的偏移。有人把这种误差也视作稳态误差,但江协把这两种误差分开讨论,后一种称为调控误差,因为调控误差的方向不确定,不符合前面稳态误差的定义。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(286deg,rgba(7,146,227,0.37) 0%,rgba(155,81,224,0.36) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(286deg,rgba(7,146,227,0.37) 0%,rgba(155,81,224,0.36) 100%)"><!-- wp:paragraph -->
<p>我调完参后发现PID分别为6.2、0、2.3左右时效果最好。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="jHPdt">增量式PID</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在视频中,江协演示了增量式PID调控位置的一个错误:</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain"} -->
<blockquote class="wp-block-quote is-style-plain"><!-- wp:paragraph -->
<p>由于增量式PID的输出值为累加out,因此该调控方式受到上一次out的影响;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>对于纯P项调控,当目标值变化缓慢时,out值相差不大,可以被视为“正确的”,经过P项修补后没问题;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当目标值快速变化时,上一次out对于当前的目标值不再“正确”,或out受到噪声干扰发送错误;那么仅靠P项很难纠正这种错误(因为P项与历史无关,所以上一次out的错误不能被纠正,P只是在一个错误的基础上修修补补而已,结果自然也是错误的)。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>可以加入I项来弥补这个缺点。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p><font style="color:#DF2A3F;">所以增量式PID最好不要给KI设置为0 。</font></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="QS3xL">PID算法改进</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>PID的改进措施有很多:</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>积分限幅:限制积分的幅度,防止积分深度饱和</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>积分分离:误差小于一个限度才开始积分,反之则去掉积分部分</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>变速积分:根据误差的大小调整积分的速度</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>微分先行:将对误差的微分替换为对实际值的微分</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>不完全微分:给微分项加入一阶惯性单元(低通滤波器)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>输出偏移:在非0输出时,给输出值加一个固定偏移</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>输入死区:误差小于一个限度时不进行调控</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="gpciy">积分限幅</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1749986079694-e77d0e9d-8f23-41e1-ae0f-07d6ee157ea9.docx">03PID_Integral_limiter.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="z4p82">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果执行器因为卡住、断电、损坏等原因不能消除误差,则误差积分会无限制加大,进而达到深度饱和状态,此时PID控制器会持续输出最大的调控力,即使后续执行器恢复正常,PID控制器在短时间内也会维持最大的调控力,直到误差积分从深度饱和状态退出。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="yCyWa">积分限幅实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>对误差积分或积分项输出进行判断,如果幅值超过指定阈值,则进行限制。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="gLYRj">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>有两种方法:一个是对误差积分项进行限幅,另一个则是对积分项进行限幅</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":" Actual = Encoder_Get();\n Error1 = Error0;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n ErrorInt += Error0;\n\n /*积分限幅*/\n if(ErrorInt \u003e 800){ErrorInt = 800;}\n if(ErrorInt \u003c -800){ErrorInt = -800;}\n\n /*PID计算*/\n Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n /*输岀限幅*/\n if(Out \u003e 1000){Out = 1000;}\n if(Out \u003c -1000){Out = -1000;}\n\n /*执行控制*/\n Motor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e800\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e800\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e800\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e800\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":20,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> Actual = Encoder_Get();
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;

/*积分限幅*/
if(ErrorInt > 800){ErrorInt = 800;}
if(ErrorInt &lt; -800){ErrorInt = -800;}

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">800</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">800</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">800</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">800</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":" Actual = Encoder_Get();\n Error1 = Error0;\n Error0 = Target - Actual;\n\n /*误差积分(累加)*/\n ErrorInt += Error0;\n\n InOut = Ki * ErrorInt;\n /*积分项限幅*/\n if(InOut \u003e 1000){InOut = 1000;}\n if(InOut \u003c -1000){InOut = -1000;}\n\n /*PID计算*/\n Out = Kp * Error0 + InOut + Kd * (Error0 - Error1);\n\n /*输岀限幅*/\n if(Out \u003e 1000){Out = 1000;}\n if(Out \u003c -1000){Out = -1000;}\n\n /*执行控制*/\n Motor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分项限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e InOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":21,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> Actual = Encoder_Get();
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;

InOut = Ki * ErrorInt;
/*积分项限幅*/
if(InOut > 1000){InOut = 1000;}
if(InOut &lt; -1000){InOut = -1000;}

/*PID计算*/
Out = Kp * Error0 + InOut + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> InOut </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt;</span></span>
<span class="line"><span style="color: #768390"> /*积分项限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(InOut </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){InOut </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(InOut </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){InOut </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> InOut </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>两种方法的好处和坏处:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>对积分进行限幅:</strong>可以防止积分饱和,使积分不会因为误差的累计而无限增大,变相控制了积分项的输出。缺点是对于不同的KI,积分范围也是不同的,如果KI需要经常改变的话调试起来很麻烦。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>对积分项进行限幅:</strong>不论KI等于多少,只要规定了整个积分项的最大值就不怕积分饱和了。但这种方法实际上并没有解决积分饱和的问题,只是减小了这个问题的影响。如果积分深度饱和,积分项还是会一直输出最大值,直到积分恢复正常。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="s57EJ">如何得到限幅范围</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>除了在<a href="#r8eo9">上文</a>里提到的实际测量的情况外,还可以通过计算得出合理的积分范围。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我们假设最坏情况:输出完全由积分组成。在这种情况下,积分 = 输出/Ki;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>也就是说,积分始终不会超过这个范围。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br><mark style="background-color:rgba(0, 0, 0, 0);color:#f75858" class="has-inline-color"> 若使用这种方法,请特别注意Ki等于0的情况。可以额外加一个判断:若Ki等于0,则不进行积分。</mark></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(227,225,7,0.32) 1%,rgba(224,81,81,0.23) 96%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(227,225,7,0.32) 1%,rgba(224,81,81,0.23) 96%)"><!-- wp:paragraph -->
<p>就像这样:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1025,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID17-1024x598.webp" alt="" class="wp-image-1025"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>其中FLT_MIN表示float型变量能表示的最小正数,需要引用float.h文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>不过这么一来又有新的问题:我们使用电位器来控制三个参数,而电位器的读数不是那么稳定的。这种情况下可以用参数有意义的最小值来判断:把FLT_MIN改成0.1。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="KaBJb">积分分离</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750075459184-e0de2133-fec2-4195-9bce-f01fa9812191.docx">04PID_integral_Separation.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="xU06M">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>积分项作用一般位于调控后期,用来消除持续的误差,调控前期一般误差较大且不需要积分项作用,如果此时仍然进行积分,则调控进行到后期时,积分项可能已经累积了过大的调控力,这会导致超调。(这就是在<a href="#ebQhr">PID闭环控制(定位)</a>里遇到的问题。)</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1026,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID18.webp" alt="" class="wp-image-1026"/><figcaption class="wp-element-caption">由于误差太小,此时P项输出的调控力不足以让电机转动,导致实际值和目标值始终差一点</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="esVv4">积分分离实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>对误差大小进行判断,如果误差绝对值小于指定阈值,则加入积分项作用,反之,则直接将误差积分清零或不加入积分项作用。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="JnPyR">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>有两种实现方法:一种是当误差大于限度时,保持误差积分为0;另一种时积分照旧,但只有误差小于限度时积分项才会参与运算。</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"Actual = location;\nError1 = Error0;\nError0 = Target - Actual;\n\n/*误差积分(累加)*/\nErrorInt += Error0;\n\n/* 积分分离 */\nif(fabs(Error0)\u003e10){\n ErrorInt=0;\n}\n\n/*PID计算*/\nOut = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}\n\n/*执行控制*/\nMotor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eActual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 积分分离 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Error0)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":21,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Actual = location;
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;

/* 积分分离 */
if(fabs(Error0)>10){
ErrorInt=0;
}

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #ADBAC7">Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> location;</span></span>
<span class="line"><span style="color: #ADBAC7">Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7">Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7">ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* 积分分离 */</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(Error0)</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*执行控制*/</span></span>
<span class="line"><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"uint8_t c = 0; /*这个变量声明放在合适的位置*/\n\nActual = location;\nError1 = Error0;\nError0 = Target - Actual;\n\n/*误差积分(累加)*/\nErrorInt += Error0;\n\n/* 积分分离 */\nif(fabs(Error0)\u003e10){\n c=0;\n}\nelse{\n c=1;\n}\n\n/*积分限幅*/\nif(ErrorInt \u003e 1000/Ki){ErrorInt = 1000/Ki;}\nif(ErrorInt \u003c -1000/Ki){ErrorInt = -1000/Ki;}\n\n/*PID计算*/\nOut = Kp * Error0 + c * Ki * ErrorInt + Kd * (Error0 - Error1);\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}\n\n/*执行控制*/\nMotor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e c \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*这个变量声明放在合适的位置*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eActual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 积分分离 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Error0)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e c\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e c\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eKi){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eKi;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eKi){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eKi;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e c \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":30,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uint8_t c = 0; /*这个变量声明放在合适的位置*/

Actual = location;
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;

/* 积分分离 */
if(fabs(Error0)>10){
c=0;
}
else{
c=1;
}

/*积分限幅*/
if(ErrorInt > 1000/Ki){ErrorInt = 1000/Ki;}
if(ErrorInt &lt; -1000/Ki){ErrorInt = -1000/Ki;}

/*PID计算*/
Out = Kp * Error0 + c * Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> c </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /*这个变量声明放在合适的位置*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> location;</span></span>
<span class="line"><span style="color: #ADBAC7">Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7">Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7">ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* 积分分离 */</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(Error0)</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> c</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> c</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*积分限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">Ki){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">Ki;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">Ki){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">Ki;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> c </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*执行控制*/</span></span>
<span class="line"><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="uaa799807"><span class="ne-text">展开查看:相同参数下两种积分分离前后对比(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID19.webp" width="354.9019674208018" id="u09e5fa59" class="ne-image"></figure><p id="u2ab5a83e" class="ne-p" style="text-align: center">引入积分项但未作积分分离,会导致严重的超调(tiáo)</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID20.webp" width="541.8300754914267" id="udd80f445" class="ne-image"></figure><p id="ue258a6d5" class="ne-p" style="text-align: center">第一种方法,可以看见此时实际值和目标值之间没有误差了,且此种方式也不会出现明显的过调</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID21.webp" width="454.24837450728774" id="u1cec6d3f" class="ne-image"></figure><p id="u7d6c0e4d" class="ne-p" style="text-align: center">这是第二种积分分离后,可以看见过调大大减小,不过也出现了抖动的现象</p>
</details>
<!-- /wp:html -->

<!-- wp:image {"id":1030,"sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID22.webp" alt="" class="wp-image-1030"/><figcaption class="wp-element-caption">第一种方法。在用手将转盘固定在一个非常小的误差时,输出值会不断增大,甚至达到上限。</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="bcgKa">变速积分</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750232819822-ddd9826e-c12a-4cd9-94e0-5dd4761d770b.docx">05_PID_Changing_Integration_Rate.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="dqrVO">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果积分分离阈值没有设定好,被控对象正好在阈值之外停下来,则此时控制器完全没有积分作用,误差不能消除 </p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="pqswv">变速积分实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>变速积分是积分分离的升级版,变速积分需要设计一个函数值随误差绝对值增大而减小的函数,函数值作为调整系数,用于调整误差积分的速度或积分项作用的强度</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(239deg,rgba(7,146,227,0.35) 0%,rgba(155,81,224,0.34) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(239deg,rgba(7,146,227,0.35) 0%,rgba(155,81,224,0.34) 100%)"><!-- wp:paragraph -->
<p><br> 变速积分是在积分分离方法二的基础上发展而来的。在方法二中由于积分一直累计,倒置积分项参与运算时会产生突变形成抖动;因此不妨将这种突变给减缓,让积分项从0一点点参与进运算里。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(227,195,7,0.32) 0%,rgba(224,81,81,0.3) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(227,195,7,0.32) 0%,rgba(224,81,81,0.3) 100%)"><!-- wp:paragraph -->
<p> 变速积分只是要求再积分前和积分后加一个缓冲函数,这个函数可以是线性的,也可以是非线性的,甚至可以是奇奇怪怪的形状。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>变速积分没有抗积分饱和的效果。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="gUG33">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/* 积分变速,k、c在合适的位置定义,c可以先设置为1,但需要实际调试才能确定合适的值 */\nk = 1 / ( c*fabs(Error0) + 1 );\n\n/*误差积分(累加)*/\nErrorInt += k *Error0;\n\n/*PID计算*/\nOut = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}\n\n/*执行控制*/\nMotor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 积分变速,k、c在合适的位置定义,c可以先设置为1,但需要实际调试才能确定合适的值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ek \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ( c\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Error0) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e );\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e k \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":15,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/* 积分变速,k、c在合适的位置定义,c可以先设置为1,但需要实际调试才能确定合适的值 */
k = 1 / ( c*fabs(Error0) + 1 );

/*误差积分(累加)*/
ErrorInt += k *Error0;

/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/* 积分变速,k、c在合适的位置定义,c可以先设置为1,但需要实际调试才能确定合适的值 */</span></span>
<span class="line"><span style="color: #ADBAC7">k </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">/</span><span style="color: #ADBAC7"> ( c</span><span style="color: #F47067">*</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(Error0) </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7">ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> k </span><span style="color: #F47067">*</span><span style="color: #ADBAC7">Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*执行控制*/</span></span>
<span class="line"><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/* 积分变速 */\nk = 1 / ( c*fabs(Error0) + 1 );\n\n/*误差积分(累加)*/\nErrorInt += Error0;\n\n/*PID计算*/\nOut = Kp * Error0 + k * Ki * ErrorInt + Kd * (Error0 - Error1);\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}\n\n/*执行控制*/\nMotor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 积分变速 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ek \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ( c\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Error0) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e );\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e k \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":15,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/* 积分变速 */
k = 1 / ( c*fabs(Error0) + 1 );

/*误差积分(累加)*/
ErrorInt += Error0;

/*PID计算*/
Out = Kp * Error0 + k * Ki * ErrorInt + Kd * (Error0 - Error1);

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/* 积分变速 */</span></span>
<span class="line"><span style="color: #ADBAC7">k </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">/</span><span style="color: #ADBAC7"> ( c</span><span style="color: #F47067">*</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(Error0) </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7">ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> k </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*执行控制*/</span></span>
<span class="line"><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="u679fa11a"><span class="ne-text">两种方式的效果(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID23.webp" width="632.0261556094205" id="u41293de5" class="ne-image"></figure><p id="u5211539d" class="ne-p">第一种,连积分分离第一种方法的小小过调也没有了</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID24.webp" width="765.3594914360201" id="uaa1702d6" class="ne-image"></figure><p id="uf8512ef1" class="ne-p">第二种,效果不太好。</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID25.webp" width="633.333345176348" id="ue6bfc925" class="ne-image"></figure><p id="ud8e9c832" class="ne-p">c=3后的第二种,效果有所增强但仍然不好</p>
</details>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p><br> 变速积分会导致误差回正的时间变长,如图:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1034,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID26-1024x434.webp" alt="" class="wp-image-1034"/><figcaption class="wp-element-caption">用手给它一个恒定的误差,再松手,可以看到回正需要较长时间</figcaption></figure>
<!-- /wp:image -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="yaEEn">微分先行</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750241303653-18ed7227-559d-47b7-b6b6-2ed6b0514d8a.docx">06_PID_Differential_Leading.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="ox5MY">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>普通PID的微分项对误差进行微分,当目标值大幅度跳变时,误差也会瞬间大幅度跳变,这会导致微分项突然输出一个很大的调控力,如果系统的目标值频繁大幅度切换,则此时的微分项不利于系统稳定。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="TkCrR">微分先行实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>将对误差的微分替换为对实际值的微分。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1035,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID27-1024x535.webp" alt="" class="wp-image-1035"/></figure>
<!-- /wp:image -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(112,112,112,0.47) 1%,rgba(42,42,42,0.52) 98%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(112,112,112,0.47) 1%,rgba(42,42,42,0.52) 98%)"><!-- wp:paragraph -->
<p>普通PID的微分项输出:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ 𝑑𝑜𝑢𝑡(𝑘)=𝐾_𝑑∗(𝑒𝑟𝑟𝑜𝑟(𝑘)−𝑒𝑟𝑟𝑜𝑟(𝑘−1)) $$</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>微分先行PID的微分项输出:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ 𝑑𝑜𝑢𝑡(𝑘)=−𝐾_𝑑∗(𝑎𝑐𝑡𝑢𝑎𝑙(𝑘)−𝑎𝑐𝑡𝑢𝑎𝑙(𝑘−1)) $$</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain"} -->
<blockquote class="wp-block-quote is-style-plain"><!-- wp:paragraph -->
<p>可以看到原本微分项要在计算误差后才会被计算,现在被提前了,因此这种方法叫微分先行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>你可能会在别的地方看到更复杂的公式。这是由于他们在微分先行的同时加了滤波器。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(300deg,rgba(7,146,227,0.24) 0%,rgba(155,81,224,0.36) 96%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(300deg,rgba(7,146,227,0.24) 0%,rgba(155,81,224,0.36) 96%)"><!-- wp:paragraph -->
<p>为什么微分先行要加负号呢?在此之前我们先回顾一下微分项的作用:阻碍系统的实际值产生变化。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>假设当前实际值比目标值低。当我们计算误差时,实际值向上变化,误差值向下变化,两者斜率符号相反。现在我们计算的是实际值了,要还想相反就需要加上负号。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="kSV2H">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>为了调试更直观,我们将微分项结果单独存入一个变量中,并通过串口打印出来。</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/*Actual1需要另外定义*/\n\nActual1 = Actual;\nActual = location;\nError1 = Error0;\nError0 = Target - Actual;\n\n/*误差积分(累加)*/\nErrorInt += Error0;\n/*积分限幅*/\nif(ErrorInt \u003e 600){ErrorInt = 600;}\nif(ErrorInt \u003c -600){ErrorInt = -600;}\n\n/*PID计算*/\nDifout = Kd * (Actual - Actual1);\nOut = Kp * Error0 + Ki * ErrorInt + Difout;\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}\n\n/*执行控制*/\nMotor_SetPWM(Out);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*Actual1需要另外定义*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eActual1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eActual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eError0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eDifout \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":23,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/*Actual1需要另外定义*/

Actual1 = Actual;
Actual = location;
Error1 = Error0;
Error0 = Target - Actual;

/*误差积分(累加)*/
ErrorInt += Error0;
/*积分限幅*/
if(ErrorInt > 600){ErrorInt = 600;}
if(ErrorInt &lt; -600){ErrorInt = -600;}

/*PID计算*/
Difout = Kd * (Actual - Actual1);
Out = Kp * Error0 + Ki * ErrorInt + Difout;

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/*Actual1需要另外定义*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">Actual1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"><span style="color: #ADBAC7">Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> location;</span></span>
<span class="line"><span style="color: #ADBAC7">Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7">Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7">ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #768390">/*积分限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Difout </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Actual </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual1);</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Difout;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*执行控制*/</span></span>
<span class="line"><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="u13e6f911"><span class="ne-text">前后对比(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值 </span><span class="ne-text" style="color: #ED740C">微分输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID28.webp" width="1001.3072082664241" id="ubb36dfe0" class="ne-image"></figure><p id="u21231afb" class="ne-p">微分先行前,积分项为0,可以看到在目标值巨变时微分项的输出直接突破天际,随后又钻入地底。</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID29.webp" width="697.3856339557929" id="u6e9ae3b5" class="ne-image"></figure><p id="u3ee80782" class="ne-p">微分先行后,微分项已经不会出现上天入地的情况</p>
</details>
<!-- /wp:html -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(227,195,7,0.28) 0%,rgba(224,81,81,0.18) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(227,195,7,0.28) 0%,rgba(224,81,81,0.18) 100%)"><!-- wp:paragraph -->
<p><br> 加入微分先行后,在某种程度上会减慢调控的速度。因为在目标值突变后,P 项正输出,D 项因为突变也有个正输出,实际上是加强了 P 项的输出,使变化更迅速。但微分先行后,D 项无论何时都只会给出负输出,减缓了调控速度。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>且对于电机控制来说,D 项的尖峰没有不良影响,因此不需要使用微分先行。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="uIn6l">不完全微分</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750259380432-cac61f08-3f0b-4ae3-9c03-5feac6b754f2.docx">07_PID_Incomplete_Derivation.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="K0QKZ">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>传感器获取的实际值经常会受到噪声干扰,而PID控制器中的微分项对噪声最为敏感,这些噪声干扰可能会导致微分项输出抖动,进而影响系统性能。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="R5bfM">不完全微分实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>给微分项加入一阶惯性单元(低通滤波器)。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1049,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/不完全微分PID框图-1024x555.webp" alt="" class="wp-image-1049"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(155deg,rgb(54,54,54) 0%,rgb(125,125,125) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(155deg,rgb(54,54,54) 0%,rgb(125,125,125) 100%)"><!-- wp:paragraph -->
<p><br> 普通PID的微分项输出:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ 𝑑𝑜𝑢𝑡(𝑘)=𝐾_𝑑∗(𝑒𝑟𝑟𝑜𝑟(𝑘)−𝑒𝑟𝑟𝑜𝑟(𝑘−1)) $$</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>不完全微分PID的微分项输出:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ 𝑑𝑜𝑢𝑡(𝑘)=(1−𝛼)∗𝐾_𝑑∗(𝑒𝑟𝑟𝑜𝑟(𝑘)−𝑒𝑟𝑟𝑜𝑟(𝑘−1))+𝛼∗𝑑𝑜𝑢𝑡(𝑘−1) $$</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(138deg,rgba(7,227,175,0.43) 0%,rgba(155,81,224,0.31) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(138deg,rgba(7,227,175,0.43) 0%,rgba(155,81,224,0.31) 100%)"><!-- wp:paragraph -->
<p>其实直接对实际值加滤波也可以,等同于同时对 PID 三项加滤波。但在一些对响应要求比较迅速的项目中就不太合适了。同时受噪声干扰最大的就是 D 项(顺便一提,最小的是 I 项),因此只给 D 项加滤波。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>一阶惯性单元就是本次应有的输出和上次输出取加权平均,得到本次实际输出:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ y(k) = (1-α)x+αy(k-1) $$</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>实际上也可以使用别的滤波器,不过谨记:<font style="color:#DF2A3F;">滤波效果越强,原波形和现波形相位差越大,即延迟越大。</font></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="KZriq">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022stdlib.h\u0022\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\nfloat Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值\nfloat Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重\nfloat Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分\n\nfloat Difout=0;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n Timer_Init();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n key_v+=204;\n break;\n case 2:\n key_v-=204;\n break;\n case 3:\n key_v=0;\n break;\n case 4:\n key_v=-key_v;\n break;\n }\n\n Kp = RP_GetValue(1)/4095.0*20;\n Ki = RP_GetValue(2)/4095.0*20;\n Kd = RP_GetValue(3)/4095.0*20;\n //Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;\n Target = key_v;\n\n OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,RP_GetValue(1));\n OLED_Printf(0,8,OLED_6X8,\u0022TAR:%+04.0f\u0022,Target);\n OLED_Printf(0,16,OLED_6X8,\u0022ACT:%+04.0f\u0022,Actual);\n OLED_Printf(0,24,OLED_6X8,\u0022OUT:%+04.0f\u0022,Out);\n OLED_Printf(0,32,OLED_6X8,\u0022EINT:%+04.0f\u0022,ErrorInt);\n\n OLED_Printf(60,0,OLED_6X8,\u0022P:%02.1f\u0022,Kp);\n OLED_Printf(60,8,OLED_6X8,\u0022I:%02.1f\u0022,Ki);\n OLED_Printf(60,16,OLED_6X8,\u0022D:%02.1f\u0022,Kd);\n\n my_USART_printf(1,\u0022%.0f,%.0f,%.0f,%.0fn\u0022,Target,Actual,Out,Difout);\n //OLED_ReverseArea(0,0,54,63);\n OLED_Reverse();\n //OLED_Update(); \n delay_ms(20);\n }\n\n}\n\n#define Alpha 0.5\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count\u003e20){\n count=0;\n OLED_Update();\n\n speed = Encoder_Get();\n location+=speed;\n\n Actual = location;\n Error1 = Error0;\n Error0 = Target - Actual;\n\n Actual += rand()%41-20; //加入随机噪声\n /*误差积分(累加)*/\n ErrorInt += Error0;\n /*积分限幅*/\n if(ErrorInt \u003e 600){ErrorInt = 600;}\n if(ErrorInt \u003c -600){ErrorInt = -600;}\n\n /*PID计算*/\n Difout = Alpha * Kd * (Error0 - Error1) + (1 - Alpha) * Difout;\n Out = Kp * Error0 + Ki * ErrorInt + Difout;\n\n /*输岀限幅*/\n if(Out \u003e 1000){Out = 1000;}\n if(Out \u003c -1000){Out = -1000;}\n\n /*执行控制*/\n Motor_SetPWM(Out);\n\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;stdlib.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标值,实际值,输出值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0, Error1, ErrorInt;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,误差积分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ekey_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;TAR:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ACT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Actual);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;OUT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;EINT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,ErrorInt);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%02.1f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Target,Actual,Out,Difout);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_ReverseArea(0,0,54,63);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update(); \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eAlpha\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003espeed;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Actual \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003erand\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e41\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //加入随机噪声\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e600\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Alpha \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Alpha) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":138,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "stdlib.h"

//当前电机速度和位置
int16_t speed=0,location=0;
float Target = 0,Actual = 0,Out = 0; //目标值,实际值,输出值
float Kp =4,Ki =2,Kd=0.3; //比例项,积分项,微分项的权重
float Error0, Error1, ErrorInt; //本次误差,上次误差,误差积分

float Difout=0;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

Timer_Init();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);
while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
key_v+=204;
break;
case 2:
key_v-=204;
break;
case 3:
key_v=0;
break;
case 4:
key_v=-key_v;
break;
}

Kp = RP_GetValue(1)/4095.0*20;
Ki = RP_GetValue(2)/4095.0*20;
Kd = RP_GetValue(3)/4095.0*20;
//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;
Target = key_v;

OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",RP_GetValue(1));
OLED_Printf(0,8,OLED_6X8,"TAR:%+04.0f",Target);
OLED_Printf(0,16,OLED_6X8,"ACT:%+04.0f",Actual);
OLED_Printf(0,24,OLED_6X8,"OUT:%+04.0f",Out);
OLED_Printf(0,32,OLED_6X8,"EINT:%+04.0f",ErrorInt);

OLED_Printf(60,0,OLED_6X8,"P:%02.1f",Kp);
OLED_Printf(60,8,OLED_6X8,"I:%02.1f",Ki);
OLED_Printf(60,16,OLED_6X8,"D:%02.1f",Kd);

my_USART_printf(1,"%.0f,%.0f,%.0f,%.0fn",Target,Actual,Out,Difout);
//OLED_ReverseArea(0,0,54,63);
OLED_Reverse();
//OLED_Update();
delay_ms(20);
}

}

#define Alpha 0.5

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count>20){
count=0;
OLED_Update();

speed = Encoder_Get();
location+=speed;

Actual = location;
Error1 = Error0;
Error0 = Target - Actual;

Actual += rand()%41-20; //加入随机噪声
/*误差积分(累加)*/
ErrorInt += Error0;
/*积分限幅*/
if(ErrorInt > 600){ErrorInt = 600;}
if(ErrorInt &lt; -600){ErrorInt = -600;}

/*PID计算*/
Difout = Alpha * Kd * (Error0 - Error1) + (1 - Alpha) * Difout;
Out = Kp * Error0 + Ki * ErrorInt + Difout;

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}

/*执行控制*/
Motor_SetPWM(Out);

}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;stdlib.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //目标值,实际值,输出值</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">,Ki </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">,Kd</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0.3</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error0, Error1, ErrorInt;</span><span style="color: #768390"> //本次误差,上次误差,误差积分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Difout</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=-</span><span style="color: #ADBAC7">key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> key_v;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,</span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">));</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;TAR:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ACT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Actual);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;OUT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;EINT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,ErrorInt);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%02.1f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Kd);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,Target,Actual,Out,Difout);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_ReverseArea(0,0,54,63);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update(); </span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Alpha</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.5</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">speed;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> location;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Actual;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> Actual </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">rand</span><span style="color: #ADBAC7">()</span><span style="color: #F47067">%</span><span style="color: #6CB6FF">41</span><span style="color: #F47067">-</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> //加入随机噪声</span></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> Error0;</span></span>
<span class="line"><span style="color: #768390"> /*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">){ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">600</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> Difout </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Alpha </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1) </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Alpha) </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Difout;</span></span>
<span class="line"><span style="color: #ADBAC7"> Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Difout;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="ufd273428"><span class="ne-text">前后对比(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值 </span><span class="ne-text" style="color: #ED740C">微分输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID30.webp" width="796.7320410422788" id="u9f85a62b" class="ne-image"></figure><p id="u7d7891b8" class="ne-p" style="text-align: center">滤波前,实际值加了±20的随机噪声</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID31.webp" width="418.30066141678293" id="u71a70201" class="ne-image"></figure><p id="u0fa4d9bc" class="ne-p" style="text-align: center">Alpha=0.5</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID32.webp" width="312.41830649565975" id="ud83a8d96" class="ne-image"></figure><p id="u8dec6da8" class="ne-p" style="text-align: center">Alpha=0.2</p>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID33.webp" width="890.1960950775913" id="u4804ad70" class="ne-image"></figure><p id="u4350a6fc" class="ne-p" style="text-align: center">位置还是能正常跟踪的</p>
</details>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="hc3t7">输出偏移</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 本节和下面输入死区共用一个项目。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="yP1uk">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>对于一些启动需要一定力度的执行器,若输出值较小,执行器可能完全无动作,这可能会引起调控误差,同时会降低系统响应速度。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="SR5mu">输出偏移实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>若输出值为0,则正常输出0,不进行调控;若输出值非0,则给输出值加一个固定偏移,跳过执行器无动作的阶段。</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(136deg,rgb(109,109,109) 0%,rgb(60,60,60) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(136deg,rgb(109,109,109) 0%,rgb(60,60,60) 100%)"><!-- wp:paragraph -->
<p>输出偏移的PID输出值:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ out(k) =<br> \begin{cases}<br> 0, &amp; out(k)=0\\<br> out(k)+offset, &amp; out(k)&gt;0\\<br> out(k) - offset,&amp; out(k)&lt;0<br> \end{cases} $$</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,145,0.33) 0%,rgba(155,81,224,0.33) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,145,0.33) 0%,rgba(155,81,224,0.33) 100%)"><!-- wp:paragraph -->
<p>通过实测我的套件在 out =41 的情况下正好正向稳定转动,out=-42 的情况下正好反向转动(41 也能转但是断断续续的)</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="AhAPc">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/*PID计算*/\nOut = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);\n\n/* 输出偏移 */\nif(Out\u003e1){\n Out+=40;\n}\nelse if(Out\u003c-1){\n Out-=40;\n}\nelse if(Out\u003c1\u0026\u0026Out\u003e-1){\n Out=0;\n}\n\n/*输岀限幅*/\nif(Out \u003e 1000){Out = 1000;}\nif(Out \u003c -1000){Out = -1000;}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (Error0 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 输出偏移 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":17,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/*PID计算*/
Out = Kp * Error0 + Ki * ErrorInt + Kd * (Error0 - Error1);

/* 输出偏移 */
if(Out>1){
Out+=40;
}
else if(Out&lt;-1){
Out-=40;
}
else if(Out&lt;1&amp;&amp;Out>-1){
Out=0;
}

/*输岀限幅*/
if(Out > 1000){Out = 1000;}
if(Out &lt; -1000){Out = -1000;}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7">Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> Error0 </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (Error0 </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> Error1);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* 输出偏移 */</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"><span style="color: #F47067">else</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&lt;-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"><span style="color: #F47067">else</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&lt;</span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&amp;&amp;</span><span style="color: #ADBAC7">Out</span><span style="color: #F47067">&gt;-</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*输岀限幅*/</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">){Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="u8440636e"><span class="ne-text">效果(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID34.webp" width="340.5228821845999" id="ue2a8403f" class="ne-image"></figure><p id="u4478a139" class="ne-p" style="text-align: center">可以看到,加了输出偏移后只要PID发送调控,电机就必定会转动。不过也会出现抖动的情况</p>
</details>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="kTRLj">输入死区</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750336914340-c2f12de8-c288-44ac-a04c-ea56c4ccb1ea.docx">08_PID_Output<em>Offset</em>&amp;Input_Dead_Zone.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="CIU4b">要解决的问题</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在某些系统中,输入的目标值或实际值有微小的噪声波动,或者系统有一定的滞后,这些情况可能会导致执行器在误差很小时频繁调控,不能最终稳定下来。</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(102,227,7,0.51) 0%,rgba(81,224,200,0.28) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(102,227,7,0.51) 0%,rgba(81,224,200,0.28) 100%)"><!-- wp:paragraph -->
<p>如果你像江协一样用电位器来控制目标值,应该会对这个问题深有体会。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>(在上面的实验中为了保证目标值的稳定我都是用按键来控制目标值的)</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="HFgGc">输入死区实现思路</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>若误差绝对值小于一个限度,则固定输出0,不进行调控</p>
<!-- /wp:paragraph -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(57,57,57,0.56) 0%,rgba(91,91,91,0.59) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(57,57,57,0.56) 0%,rgba(91,91,91,0.59) 100%)"><!-- wp:paragraph -->
<p>输入死区的PID输出值:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$$ out(k) =<br> \begin{cases}<br> 0, &amp; |ERROR(k)|&lt;A\\<br> out(k), &amp; |ERROR(k)|&gt;A<br> \end{cases} $$</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="A2GxB">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"/* 输出偏移\u0026输入死区 */\nif(fabs(Error0)\u003c5){\n Out=0;\n}\nelse{\n if(Out\u003e0.1){\n Out+=41;\n }\n else if(Out\u003c-0.1){\n Out-=41;\n }\n else if(Out\u003c0.1\u0026\u0026Out\u003e-0.1){\n Out=0;\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* 输出偏移\u0026amp;输入死区 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Error0)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e41\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e41\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eOut\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":15,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/* 输出偏移&amp;输入死区 */
if(fabs(Error0)&lt;5){
Out=0;
}
else{
if(Out>0.1){
Out+=41;
}
else if(Out&lt;-0.1){
Out-=41;
}
else if(Out&lt;0.1&amp;&amp;Out>-0.1){
Out=0;
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">/* 输出偏移&amp;输入死区 */</span></span>
<span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(Error0)</span><span style="color: #F47067">&lt;</span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">0.1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">41</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&lt;-</span><span style="color: #6CB6FF">0.1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">41</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(Out</span><span style="color: #F47067">&lt;</span><span style="color: #6CB6FF">0.1</span><span style="color: #F47067">&amp;&amp;</span><span style="color: #ADBAC7">Out</span><span style="color: #F47067">&gt;-</span><span style="color: #6CB6FF">0.1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:html -->
<details class="lake-collapse">
<summary id="uabaebd6d"><span class="ne-text">前后对比(</span><span class="ne-text" style="color: #DF2A3F">目标值</span><span class="ne-text"> </span><span class="ne-text" style="color: #8CCF17">实际值</span><span class="ne-text"> </span><span class="ne-text" style="color: #0C68CA">输出值</span><span class="ne-text">)</span></summary>
<figure><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID35.webp" width="294.1176525586755" id="u894fb455" class="ne-image"></figure><p id="u81dcf339" class="ne-p" style="text-align: center">加死区前和加死区后的对比,还有零星的波动可以把死区范围调大点</p>
</details>
<!-- /wp:html -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,154,0.38) 0%,rgba(155,81,224,0.35) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,154,0.38) 0%,rgba(155,81,224,0.35) 100%)"><!-- wp:paragraph -->
<p>输出偏移和输入死区做的事是在不引入 I 项的情况下实现较小的误差,从而规避 I 项的滞后性。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading" id="tSVW3">双环 PID</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>单环PID只能对被控对象的一个物理量进行闭环控制,而当用户需要对被控对象的多个维度物理量(例如:速度、位置、角度等)进行控制时,则需要多个PID控制环路,即多环PID,多个PID串级连接,因此也称作串级PID。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>多环PID相较于单环PID,功能上,可以实现对更多物理量的控制,性能上,可以使系统拥有更高的准确性、稳定性和响应速度。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1044,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID36-1024x263.webp" alt="" class="wp-image-1044"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="eF9rE">双环 PID 基本原理</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="SQsr4">为什么要使用双环 PID</h3>
<!-- /wp:heading -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,137,0.35) 0%,rgba(155,81,224,0.45) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,137,0.35) 0%,rgba(155,81,224,0.45) 100%)"><!-- wp:paragraph -->
<p>回想我们上面定位置控制的几个改进方法:输出偏移和输入死区,都是由于位置控制器输出的 PWM 波太小不足以驱动电机而造成的。为什么定速控制没有这个问题?因为定速控制会自动加大 PWM 来产生一个足以驱动变化的力。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>那么我们只要让位置环根据位置输出速度,速度环接受速度调控电机就好了,不会出现驱动力不足的情况。这也是为什么多环 PID 通常在性能上更好的原因。(这里的性能不是指计算性能,而是指调控速度、调控效果等)</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1045,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID37-1024x275.webp" alt="" class="wp-image-1045"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>除此之外,多环 PID 抗干扰也更强。还是用上面的例子,如果我们将转盘位置用手转动,此时速度不为 0,因此速度环会输出负向力抵抗;同时,由于位置发生改变,位置环也会输出一个复速度给速度环,从而加大速度环的输出;所以双环实际上会产生更大的阻尼来阻止意料外的变动。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>不仅如此,只要我们对外环的输出进行限幅,就可以达到类似“以指定速度旋转到指定位置”的效果</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="a2ZCW">确定调控周期 T</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>除了与单环 PID 周期相同的注意事项外,还要注意外环的调控周期不得小于内环,否则外环更新的目标值内环接收不到,属于无效调控;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>另外,内环一般用于调控变化较快的物理量,外环用于变化较慢的物理量,所以一般内环的调控周期比外环快。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="ODjY3">调参</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>由于内环可以独立工作,所以一般先使内环独立工作,调节内环,在套上外环,调节外环。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="ah7qE">程序实现</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> 附件如下,请下载后将后缀名改为zip解压缩。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750405458581-f062eb56-85ef-4cf9-99f9-c5cf6ee382a2.docx">09_PID_Double_Closed_loop_Control(location).docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在实现双环 PID 之前,我们先将 PID 控制逻辑封装一下。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><br> <mark style="background-color:rgba(0, 0, 0, 0);color:#ffbb50" class="has-inline-color">本文的封装和江协不太一样。我的封装将上面那些算法改进全部包含在内并使用标志位的形式让用户选择使用。简单来说,此封装比江协封装功能更全面,但用法上也更麻烦。如果你什么改进措施都不要的话,那使用方法和江协几乎一样。</mark></p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"#ifndef PID_H\n#define PID_H\n\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022math.h\u0022\n#include \u0022stdbool.h\u0022\n#include \u0022float.h\u0022\n#include \u0022stdlib.h\u0022\n#include \u0022string.h\u0022\n\n#define PID_OK 1\n#define PID_ERROR 0\n#define PID_RESET 0\n#define PID_SET 1\n#define PID_OPT_II 1\u003c\u003c0 //积分限幅选项\n#define PID_OPT_IS 1\u003c\u003c1 //积分分离,作用于积分值\n#define PID_OPT_CIR 1\u003c\u003c2 //变速积分,作用于积分速度\n#define PID_OPT_DL 1\u003c\u003c3 //微分先行\n#define PID_OPT_ID 1\u003c\u003c4 //不完全微分\n#define PID_OPT_OO 1\u003c\u003c5 //输出偏移\n#define PID_OPT_IDZ 1\u003c\u003c6 //输入死区\n\n#define __PID_GET_OPTION(__HANDLE__,__FLAG__) (((__HANDLE__)-\u003eOption \u0026(__FLAG__)) == (__FLAG__))\n\ntypedef struct {\n float Target,Actual_l,Actual_n,Out; //目标,上一次的实际值,这一次实际值,输出\n float Kp,Ki,Kd; //比例项,积分项,微分项的权重\n float Error_n, Error_l, ErrorInt; //本次误差,上次误差,误差积分\n float Difout_n,Difout_l; //这次微分项值,上次值\n uint8_t Option; //选择哪些优化\n float ID_A; //不完全微分参数\n float IDZ_A; //输入死区参数\n float OO_UP,OO_DOWN;//输出偏移参数\n float CIR_C; //变速积分参数\n float IS_A; //积分分离参数\n float II_MAX,II_MIN;//积分限幅参数,上下限\n float Out_max,Out_min;//输出限幅\n}PID_t;\n\n//初始化结构体\nvoid PID_InitStruct(PID_t* s);\n//添加算法改进选项\nvoid PID_Enable_Opt(PID_t* s,uint8_t opt);\n//设置目标值\nvoid PID_SetTarget(PID_t* s,float tar);\n//更新实际值\nvoid PID_UpdateActual(PID_t* s,float act);\n//计算结果\nvoid PID_UpdateOut(PID_t* s);\n\n#endif\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;math.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;stdbool.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;float.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;stdlib.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OK\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_ERROR\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_RESET\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SET\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_II\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //积分限幅选项\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_IS\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //积分分离,作用于积分值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_CIR\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //变速积分,作用于积分速度\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_DL\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //微分先行\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_ID\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //不完全微分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_OO\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //输出偏移\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_OPT_IDZ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e6\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //输入死区\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e__HANDLE__\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e__FLAG__\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) (((\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e__HANDLE__\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)-\u0026gt;Option \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e__FLAG__\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e__FLAG__\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e))\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003etypedef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Target,Actual_l,Actual_n,Out;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //目标,上一次的实际值,这一次实际值,输出\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Kp,Ki,Kd;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //比例项,积分项,微分项的权重\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Error_n, Error_l, ErrorInt;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //本次误差,上次误差,误差积分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Difout_n,Difout_l;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //这次微分项值,上次值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Option;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //选择哪些优化\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ID_A;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //不完全微分参数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e IDZ_A;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //输入死区参数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e OO_UP,OO_DOWN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//输出偏移参数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CIR_C;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //变速积分参数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e IS_A;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //积分分离参数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e II_MAX,II_MIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//积分限幅参数,上下限\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Out_max,Out_min;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//输出限幅\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//初始化结构体\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//添加算法改进选项\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_Enable_Opt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eopt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//设置目标值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//更新实际值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eact\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//计算结果\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":52,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#ifndef PID_H
#define PID_H

#include "./SYSTEM/sys/sys.h"
#include "math.h"
#include "stdbool.h"
#include "float.h"
#include "stdlib.h"
#include "string.h"

#define PID_OK 1
#define PID_ERROR 0
#define PID_RESET 0
#define PID_SET 1
#define PID_OPT_II 1&lt;&lt;0 //积分限幅选项
#define PID_OPT_IS 1&lt;&lt;1 //积分分离,作用于积分值
#define PID_OPT_CIR 1&lt;&lt;2 //变速积分,作用于积分速度
#define PID_OPT_DL 1&lt;&lt;3 //微分先行
#define PID_OPT_ID 1&lt;&lt;4 //不完全微分
#define PID_OPT_OO 1&lt;&lt;5 //输出偏移
#define PID_OPT_IDZ 1&lt;&lt;6 //输入死区

#define __PID_GET_OPTION(__HANDLE__,__FLAG__) (((__HANDLE__)->Option &amp;(__FLAG__)) == (__FLAG__))

typedef struct {
float Target,Actual_l,Actual_n,Out; //目标,上一次的实际值,这一次实际值,输出
float Kp,Ki,Kd; //比例项,积分项,微分项的权重
float Error_n, Error_l, ErrorInt; //本次误差,上次误差,误差积分
float Difout_n,Difout_l; //这次微分项值,上次值
uint8_t Option; //选择哪些优化
float ID_A; //不完全微分参数
float IDZ_A; //输入死区参数
float OO_UP,OO_DOWN;//输出偏移参数
float CIR_C; //变速积分参数
float IS_A; //积分分离参数
float II_MAX,II_MIN;//积分限幅参数,上下限
float Out_max,Out_min;//输出限幅
}PID_t;

//初始化结构体
void PID_InitStruct(PID_t* s);
//添加算法改进选项
void PID_Enable_Opt(PID_t* s,uint8_t opt);
//设置目标值
void PID_SetTarget(PID_t* s,float tar);
//更新实际值
void PID_UpdateActual(PID_t* s,float act);
//计算结果
void PID_UpdateOut(PID_t* s);

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_H</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;math.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;stdbool.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;float.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;stdlib.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OK</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_ERROR</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_RESET</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SET</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_II</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">0</span><span style="color: #768390"> //积分限幅选项</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_IS</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">1</span><span style="color: #768390"> //积分分离,作用于积分值</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_CIR</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">2</span><span style="color: #768390"> //变速积分,作用于积分速度</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_DL</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">3</span><span style="color: #768390"> //微分先行</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_ID</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">4</span><span style="color: #768390"> //不完全微分</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_OO</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">5</span><span style="color: #768390"> //输出偏移</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_OPT_IDZ</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">&lt;&lt;</span><span style="color: #6CB6FF">6</span><span style="color: #768390"> //输入死区</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">__HANDLE__</span><span style="color: #ADBAC7">,</span><span style="color: #F69D50">__FLAG__</span><span style="color: #ADBAC7">) (((</span><span style="color: #F69D50">__HANDLE__</span><span style="color: #ADBAC7">)-&gt;Option </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">__FLAG__</span><span style="color: #ADBAC7">)) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> (</span><span style="color: #F69D50">__FLAG__</span><span style="color: #ADBAC7">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">typedef</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">struct</span><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Target,Actual_l,Actual_n,Out;</span><span style="color: #768390"> //目标,上一次的实际值,这一次实际值,输出</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Kp,Ki,Kd;</span><span style="color: #768390"> //比例项,积分项,微分项的权重</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Error_n, Error_l, ErrorInt;</span><span style="color: #768390"> //本次误差,上次误差,误差积分</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Difout_n,Difout_l;</span><span style="color: #768390"> //这次微分项值,上次值</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> Option;</span><span style="color: #768390"> //选择哪些优化</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> ID_A;</span><span style="color: #768390"> //不完全微分参数</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> IDZ_A;</span><span style="color: #768390"> //输入死区参数</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> OO_UP,OO_DOWN;</span><span style="color: #768390">//输出偏移参数</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> CIR_C;</span><span style="color: #768390"> //变速积分参数</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> IS_A;</span><span style="color: #768390"> //积分分离参数</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> II_MAX,II_MIN;</span><span style="color: #768390">//积分限幅参数,上下限</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> Out_max,Out_min;</span><span style="color: #768390">//输出限幅</span></span>
<span class="line"><span style="color: #ADBAC7">}</span><span style="color: #6CB6FF">PID_t</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//初始化结构体</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #768390">//添加算法改进选项</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_Enable_Opt</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">opt</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #768390">//设置目标值</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">tar</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #768390">//更新实际值</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">act</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #768390">//计算结果</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#include \u0022PID.h\u0022\n\n//初始化结构体\nvoid PID_InitStruct(PID_t* s){\n memset(s,0,sizeof(PID_t));\n}\n\n//添加算法改进选项\nvoid PID_Enable_Opt(PID_t* s,uint8_t opt){\n s-\u003eOption|=opt;\n}\n\n//设置目标值\nvoid PID_SetTarget(PID_t* s,float tar){\n s-\u003eTarget = tar;\n}\n\n//更新实际值\nvoid PID_UpdateActual(PID_t* s,float act){\n s-\u003eActual_l = s-\u003eActual_n;\n s-\u003eActual_n = act;\n}\n\n//计算结果\nvoid PID_UpdateOut(PID_t* s){\n\n float k=1;\n\n s-\u003eError_l = s-\u003eError_n;\n s-\u003eError_n = s-\u003eTarget - s-\u003eActual_n;\n\n /*变速积分(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_CIR) != PID_RESET)\n {\n k = 1/( s-\u003eCIR_C*fabs(s-\u003eError_n) + 1 );\n\n }\n\n /*误差积分(累加)*/\n s-\u003eErrorInt += k * s-\u003eError_n;\n\n /*积分分离(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_IS) != PID_RESET)\n {\n if(fabs(s-\u003eError_n)\u003es-\u003eIS_A)\n s-\u003eErrorInt=0;\n }\n\n /*积分限幅(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_II) != PID_RESET)\n {\n if(s-\u003eErrorInt \u003e s-\u003eII_MAX){s-\u003eErrorInt = s-\u003eII_MAX;}\n if(s-\u003eErrorInt \u003c s-\u003eII_MIN){s-\u003eErrorInt = s-\u003eII_MIN;}\n }\n\n /*计算微分项*/\n s-\u003eDifout_l = s-\u003eDifout_n;\n s-\u003eDifout_n = s-\u003eKd * (s-\u003eError_n - s-\u003eError_l);\n\n /*微分先行(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_DL) != PID_RESET)\n {\n s-\u003eDifout_n = s-\u003eKd * (s-\u003eActual_n - s-\u003eActual_l);\n }\n\n /*不完全微分(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_ID) != PID_RESET)\n {\n s-\u003eDifout_n = (1-s-\u003eID_A) * s-\u003eDifout_n + s-\u003eID_A * s-\u003eDifout_l;\n }\n\n /*PID计算*/\n s-\u003eOut = s-\u003eKp * s-\u003eError_n + s-\u003eKi * s-\u003eErrorInt + s-\u003eDifout_n;\n\n /*输入死区(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_IDZ) != PID_RESET)\n {\n if(fabs(s-\u003eError_n)\u003cs-\u003eIDZ_A){\n s-\u003eOut=0;\n }\n }\n\n /*输出偏移(可选)*/\n if(__PID_GET_OPTION(s,PID_OPT_OO) != PID_RESET)\n {\n if(s-\u003eOut\u003e0.5){\n s-\u003eOut+=s-\u003eOO_UP;\n }else if(s-\u003eOut\u003c-0.5){\n s-\u003eOut-=s-\u003eOO_DOWN;\n }else{\n s-\u003eOut=0;\n }\n }\n\n /*输岀限幅*/\n if(s-\u003eOut \u003e s-\u003eOut_max){s-\u003eOut = s-\u003eOut_max;}\n if(s-\u003eOut \u003c s-\u003eOut_min){s-\u003eOut = s-\u003eOut_min;}\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//初始化结构体\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ememset\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003esizeof\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//添加算法改进选项\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_Enable_Opt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eopt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Option\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eopt;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//设置目标值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e tar;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//更新实际值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eact\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Actual_l \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Actual_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Actual_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e act;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//计算结果\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003es\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e k\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_l \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Target \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Actual_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*变速积分(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_CIR) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e k \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e( s-\u0026gt;CIR_C\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Error_n) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e );\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*误差积分(累加)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e k \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分分离(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_IS) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Error_n)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003es-\u0026gt;IS_A)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*积分限幅(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_II) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;II_MAX){s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;II_MAX;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;II_MIN){s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;II_MIN;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*计算微分项*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_l \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (s-\u0026gt;Error_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_l);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*微分先行(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_DL) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (s-\u0026gt;Actual_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Actual_l);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*不完全微分(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_ID) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003es-\u0026gt;ID_A) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;ID_A \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_l;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*PID计算*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Error_n \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;ErrorInt \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Difout_n;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输入死区(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_IDZ) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003efabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Error_n)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003es-\u0026gt;IDZ_A){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输出偏移(可选)*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__PID_GET_OPTION\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s,PID_OPT_OO) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e PID_RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003es-\u0026gt;OO_UP;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003es-\u0026gt;OO_DOWN;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*输岀限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out_max){s-\u0026gt;Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out_max;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(s-\u0026gt;Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out_min){s-\u0026gt;Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e s-\u0026gt;Out_min;}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":98,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include "PID.h"

//初始化结构体
void PID_InitStruct(PID_t* s){
memset(s,0,sizeof(PID_t));
}

//添加算法改进选项
void PID_Enable_Opt(PID_t* s,uint8_t opt){
s->Option|=opt;
}

//设置目标值
void PID_SetTarget(PID_t* s,float tar){
s->Target = tar;
}

//更新实际值
void PID_UpdateActual(PID_t* s,float act){
s->Actual_l = s->Actual_n;
s->Actual_n = act;
}

//计算结果
void PID_UpdateOut(PID_t* s){

float k=1;

s->Error_l = s->Error_n;
s->Error_n = s->Target - s->Actual_n;

/*变速积分(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_CIR) != PID_RESET)
{
k = 1/( s->CIR_C*fabs(s->Error_n) + 1 );

}

/*误差积分(累加)*/
s->ErrorInt += k * s->Error_n;

/*积分分离(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_IS) != PID_RESET)
{
if(fabs(s->Error_n)>s->IS_A)
s->ErrorInt=0;
}

/*积分限幅(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_II) != PID_RESET)
{
if(s->ErrorInt > s->II_MAX){s->ErrorInt = s->II_MAX;}
if(s->ErrorInt &lt; s->II_MIN){s->ErrorInt = s->II_MIN;}
}

/*计算微分项*/
s->Difout_l = s->Difout_n;
s->Difout_n = s->Kd * (s->Error_n - s->Error_l);

/*微分先行(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_DL) != PID_RESET)
{
s->Difout_n = s->Kd * (s->Actual_n - s->Actual_l);
}

/*不完全微分(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_ID) != PID_RESET)
{
s->Difout_n = (1-s->ID_A) * s->Difout_n + s->ID_A * s->Difout_l;
}

/*PID计算*/
s->Out = s->Kp * s->Error_n + s->Ki * s->ErrorInt + s->Difout_n;

/*输入死区(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_IDZ) != PID_RESET)
{
if(fabs(s->Error_n)&lt;s->IDZ_A){
s->Out=0;
}
}

/*输出偏移(可选)*/
if(__PID_GET_OPTION(s,PID_OPT_OO) != PID_RESET)
{
if(s->Out>0.5){
s->Out+=s->OO_UP;
}else if(s->Out&lt;-0.5){
s->Out-=s->OO_DOWN;
}else{
s->Out=0;
}
}

/*输岀限幅*/
if(s->Out > s->Out_max){s->Out = s->Out_max;}
if(s->Out &lt; s->Out_min){s->Out = s->Out_min;}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//初始化结构体</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">memset</span><span style="color: #ADBAC7">(s,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">sizeof</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #ADBAC7">));</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//添加算法改进选项</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_Enable_Opt</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">opt</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Option</span><span style="color: #F47067">|=</span><span style="color: #ADBAC7">opt;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//设置目标值</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">tar</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Target </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> tar;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//更新实际值</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">act</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Actual_l </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Actual_n;</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Actual_n </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> act;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//计算结果</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">PID_t</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">){</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float</span><span style="color: #ADBAC7"> k</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Error_l </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Error_n;</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Error_n </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Target </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> s-&gt;Actual_n;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*变速积分(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_CIR) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> k </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">( s-&gt;CIR_C</span><span style="color: #F47067">*</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(s-&gt;Error_n) </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*误差积分(累加)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;ErrorInt </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> k </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> s-&gt;Error_n;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*积分分离(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_IS) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(s-&gt;Error_n)</span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7">s-&gt;IS_A)</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*积分限幅(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_II) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;ErrorInt </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> s-&gt;II_MAX){s-&gt;ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;II_MAX;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;ErrorInt </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> s-&gt;II_MIN){s-&gt;ErrorInt </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;II_MIN;}</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*计算微分项*/</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Difout_l </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Difout_n;</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Difout_n </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (s-&gt;Error_n </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> s-&gt;Error_l);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*微分先行(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_DL) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Difout_n </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Kd </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> (s-&gt;Actual_n </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> s-&gt;Actual_l);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*不完全微分(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_ID) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Difout_n </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">s-&gt;ID_A) </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> s-&gt;Difout_n </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> s-&gt;ID_A </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> s-&gt;Difout_l;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*PID计算*/</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Kp </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> s-&gt;Error_n </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> s-&gt;Ki </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> s-&gt;ErrorInt </span><span style="color: #F47067">+</span><span style="color: #ADBAC7"> s-&gt;Difout_n;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输入死区(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_IDZ) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">fabs</span><span style="color: #ADBAC7">(s-&gt;Error_n)</span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7">s-&gt;IDZ_A){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输出偏移(可选)*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__PID_GET_OPTION</span><span style="color: #ADBAC7">(s,PID_OPT_OO) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> PID_RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;Out</span><span style="color: #F47067">&gt;</span><span style="color: #6CB6FF">0.5</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Out</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">s-&gt;OO_UP;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;Out</span><span style="color: #F47067">&lt;-</span><span style="color: #6CB6FF">0.5</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Out</span><span style="color: #F47067">-=</span><span style="color: #ADBAC7">s-&gt;OO_DOWN;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> s-&gt;Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*输岀限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;Out </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> s-&gt;Out_max){s-&gt;Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Out_max;}</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(s-&gt;Out </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> s-&gt;Out_min){s-&gt;Out </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> s-&gt;Out_min;}</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022PID.h\u0022\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\n\nPID_t SpeedLoop,LocationLoop;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n Timer_Init();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n\n /*初始化PID结构体*/\n PID_InitStruct(\u0026SpeedLoop);\n PID_InitStruct(\u0026LocationLoop);\n\n SpeedLoop.Kp = 5,SpeedLoop.Ki = 5,SpeedLoop.Kd=0;\n SpeedLoop.Out_max = 1000;SpeedLoop.Out_min=-1000;\n\n LocationLoop.Kp = 0.3,LocationLoop.Ki = 0.01,LocationLoop.Kd=0.1;\n LocationLoop.Out_max = 140;LocationLoop.Out_min=-140;\n\n PID_Enable_Opt(\u0026SpeedLoop,PID_OPT_II);/*积分限幅*/\n SpeedLoop.II_MAX = SpeedLoop.Out_max/SpeedLoop.Ki;\n SpeedLoop.II_MIN = SpeedLoop.Out_min/SpeedLoop.Ki;\n\n PID_Enable_Opt(\u0026LocationLoop,PID_OPT_IS);/*积分分离*/\n LocationLoop.IS_A=10;\n\n PID_Enable_Opt(\u0026LocationLoop,PID_OPT_II);/*积分限幅*/\n LocationLoop.II_MAX = LocationLoop.Out_max/LocationLoop.Ki;\n LocationLoop.II_MIN = LocationLoop.Out_min/LocationLoop.Ki;\n\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n key_v+=204;\n break;\n case 2:\n key_v-=204;\n break;\n case 3:\n key_v=0;\n break;\n case 4:\n key_v=-key_v;\n break;\n }\n\n LocationLoop.Kp = RP_GetValue(1)/4095.0*7;\n LocationLoop.Ki = RP_GetValue(2)/4095.0*7;\n LocationLoop.Kd = RP_GetValue(3)/4095.0*7;\n //Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;\n //LocationLoop.Target = key_v;\n PID_SetTarget(\u0026LocationLoop,key_v);\n\n OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,RP_GetValue(1));\n OLED_Printf(0,8,OLED_6X8,\u0022TAR:%+04.0f\u0022,LocationLoop.Target);\n OLED_Printf(0,16,OLED_6X8,\u0022ACT:%+04.0f\u0022,LocationLoop.Actual_n);\n OLED_Printf(0,24,OLED_6X8,\u0022OUT:%+04.0f\u0022,LocationLoop.Out);\n OLED_Printf(0,32,OLED_6X8,\u0022EINT:%+04.0f\u0022,LocationLoop.ErrorInt);\n\n OLED_Printf(60,0,OLED_6X8,\u0022P:%03.2f\u0022,LocationLoop.Kp);\n OLED_Printf(60,8,OLED_6X8,\u0022I:%03.2f\u0022,LocationLoop.Ki);\n OLED_Printf(60,16,OLED_6X8,\u0022D:%03.2f\u0022,LocationLoop.Kd);\n\n my_USART_printf(1,\u0022%.0f,%.0f,%.0fn\u0022,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\n OLED_Reverse();\n //OLED_Update();\n\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count%20==0){\n OLED_Update();\n\n speed = Encoder_Get();\n location+=speed;\n\n PID_UpdateActual(\u0026SpeedLoop,speed);\n PID_UpdateOut(\u0026SpeedLoop);\n\n Motor_SetPWM(SpeedLoop.Out);\n }\n\n if(count==40){\n count=0;\n\n PID_UpdateActual(\u0026LocationLoop,location);\n\n PID_UpdateOut(\u0026LocationLoop);\n\n /*执行控制*/\n PID_SetTarget(\u0026SpeedLoop,LocationLoop.Out);\n\n }\n\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop,LocationLoop;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*初始化PID结构体*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,SpeedLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,SpeedLoop.Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.Out_max \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;SpeedLoop.Out_min\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.01\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kd\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_max \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e140\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;LocationLoop.Out_min\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e140\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_Enable_Opt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop,PID_OPT_II);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.II_MAX \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.Out_max\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.II_MIN \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SpeedLoop.Out_min\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_Enable_Opt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,PID_OPT_IS);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*积分分离*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.IS_A\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_Enable_Opt\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,PID_OPT_II);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*积分限幅*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.II_MAX \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_max\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.II_MIN \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_min\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ekey_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e7\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e7\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4095.0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e7\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//LocationLoop.Target = key_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,key_v);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;TAR:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ACT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Actual_n);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;OUT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;EINT:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%+04.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.ErrorInt);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%03.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%03.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e60\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%03.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%.0f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003espeed;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop,speed);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(SpeedLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,location);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*执行控制*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eSpeedLoop,LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":151,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "PID.h"

//当前电机速度和位置
int16_t speed=0,location=0;

PID_t SpeedLoop,LocationLoop;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

Timer_Init();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);

/*初始化PID结构体*/
PID_InitStruct(&amp;SpeedLoop);
PID_InitStruct(&amp;LocationLoop);

SpeedLoop.Kp = 5,SpeedLoop.Ki = 5,SpeedLoop.Kd=0;
SpeedLoop.Out_max = 1000;SpeedLoop.Out_min=-1000;

LocationLoop.Kp = 0.3,LocationLoop.Ki = 0.01,LocationLoop.Kd=0.1;
LocationLoop.Out_max = 140;LocationLoop.Out_min=-140;

PID_Enable_Opt(&amp;SpeedLoop,PID_OPT_II);/*积分限幅*/
SpeedLoop.II_MAX = SpeedLoop.Out_max/SpeedLoop.Ki;
SpeedLoop.II_MIN = SpeedLoop.Out_min/SpeedLoop.Ki;

PID_Enable_Opt(&amp;LocationLoop,PID_OPT_IS);/*积分分离*/
LocationLoop.IS_A=10;

PID_Enable_Opt(&amp;LocationLoop,PID_OPT_II);/*积分限幅*/
LocationLoop.II_MAX = LocationLoop.Out_max/LocationLoop.Ki;
LocationLoop.II_MIN = LocationLoop.Out_min/LocationLoop.Ki;

while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
key_v+=204;
break;
case 2:
key_v-=204;
break;
case 3:
key_v=0;
break;
case 4:
key_v=-key_v;
break;
}

LocationLoop.Kp = RP_GetValue(1)/4095.0*7;
LocationLoop.Ki = RP_GetValue(2)/4095.0*7;
LocationLoop.Kd = RP_GetValue(3)/4095.0*7;
//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;
//LocationLoop.Target = key_v;
PID_SetTarget(&amp;LocationLoop,key_v);

OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",RP_GetValue(1));
OLED_Printf(0,8,OLED_6X8,"TAR:%+04.0f",LocationLoop.Target);
OLED_Printf(0,16,OLED_6X8,"ACT:%+04.0f",LocationLoop.Actual_n);
OLED_Printf(0,24,OLED_6X8,"OUT:%+04.0f",LocationLoop.Out);
OLED_Printf(0,32,OLED_6X8,"EINT:%+04.0f",LocationLoop.ErrorInt);

OLED_Printf(60,0,OLED_6X8,"P:%03.2f",LocationLoop.Kp);
OLED_Printf(60,8,OLED_6X8,"I:%03.2f",LocationLoop.Ki);
OLED_Printf(60,16,OLED_6X8,"D:%03.2f",LocationLoop.Kd);

my_USART_printf(1,"%.0f,%.0f,%.0fn",LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);
OLED_Reverse();
//OLED_Update();

delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count%20==0){
OLED_Update();

speed = Encoder_Get();
location+=speed;

PID_UpdateActual(&amp;SpeedLoop,speed);
PID_UpdateOut(&amp;SpeedLoop);

Motor_SetPWM(SpeedLoop.Out);
}

if(count==40){
count=0;

PID_UpdateActual(&amp;LocationLoop,location);

PID_UpdateOut(&amp;LocationLoop);

/*执行控制*/
PID_SetTarget(&amp;SpeedLoop,LocationLoop.Out);

}

__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6CB6FF">PID_t</span><span style="color: #ADBAC7"> SpeedLoop,LocationLoop;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*初始化PID结构体*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">SpeedLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> SpeedLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">,SpeedLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">,SpeedLoop.Kd</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> SpeedLoop.Out_max </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;SpeedLoop.Out_min</span><span style="color: #F47067">=-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.3</span><span style="color: #ADBAC7">,LocationLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.01</span><span style="color: #ADBAC7">,LocationLoop.Kd</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0.1</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Out_max </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">140</span><span style="color: #ADBAC7">;LocationLoop.Out_min</span><span style="color: #F47067">=-</span><span style="color: #6CB6FF">140</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_Enable_Opt</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">SpeedLoop,PID_OPT_II);</span><span style="color: #768390">/*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> SpeedLoop.II_MAX </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> SpeedLoop.Out_max</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">SpeedLoop.Ki;</span></span>
<span class="line"><span style="color: #ADBAC7"> SpeedLoop.II_MIN </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> SpeedLoop.Out_min</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">SpeedLoop.Ki;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_Enable_Opt</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,PID_OPT_IS);</span><span style="color: #768390">/*积分分离*/</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.IS_A</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_Enable_Opt</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,PID_OPT_II);</span><span style="color: #768390">/*积分限幅*/</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.II_MAX </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> LocationLoop.Out_max</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">LocationLoop.Ki;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.II_MIN </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> LocationLoop.Out_min</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">LocationLoop.Ki;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=-</span><span style="color: #ADBAC7">key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">7</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">7</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">/</span><span style="color: #6CB6FF">4095.0</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">7</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Target = RP_GetValue(4)/4095.0*1832 - 916 + key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//LocationLoop.Target = key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,key_v);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,</span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">));</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;TAR:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ACT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Actual_n);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;OUT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;EINT:</span><span style="color: #F47067">%+04.0f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.ErrorInt);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%03.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%03.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">60</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%03.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Kd);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%.0f</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">%</span><span style="color: #6CB6FF">20</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">speed;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">SpeedLoop,speed);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">SpeedLoop);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(SpeedLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,location);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*执行控制*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">SpeedLoop,LocationLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,168,0.53) 0%,rgba(155,81,224,0.36) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,168,0.53) 0%,rgba(155,81,224,0.36) 100%)"><!-- wp:paragraph -->
<p>串口图像和上面基本一样,就不截图了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>使用体验:SpeedLoopPID 为 5、5、0,LocationLoop 为 0.3、0、0.1 的情况下有较好的结果,尤其是当用手强行转动转盘时能感到有一个很大的阻力。不过双环在调参时完全就是另外一种体验了:难。虽然回过头来想想也没多麻烦,但当时调到时候遇到的那种 P 加大了超调,D 加大了震荡,I 不为零就在目标值之间反复横跳的感觉实在太糟了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading -->
<h2 class="wp-block-heading" id="fiM6Z">双环编程实战:倒立摆</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>一个倒立摆要实现如下功能:</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>保证摆锤道理状态不掉;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>保证横杆维持在初始位置附近;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>有外力作用时可以迅速回正。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>基于上面的要求,我们需要调控的有两个量:摆锤的角度和横杆的位置。因此至少需要两个控制器才能完成。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="AlAbx">添加角度传感器驱动</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><br> <a href="https://www.yuque.com/attachments/yuque/0/2025/docx/40561973/1750427359737-72d78d56-4b40-4161-a1b8-839a7c28026a.docx">10_PID_Inverted_Pendulum_SimpleDriver.docx</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我们的角度传感器本质上是一个电位器。虽然它不像一般电位器那样只能旋转一定角度,但其测量角度是有一定限制的。示意图如下:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1046,"width":"920px","height":"auto","sizeSlug":"full","linkDestination":"none"} -->
<figure class="wp-block-image size-full is-resized"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID38.webp" alt="" class="wp-image-1046" style="width:920px;height:auto"/></figure>
<!-- /wp:image -->

<!-- wp:details -->
<details class="wp-block-details"><summary>adc.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"\n#ifndef __ADC_H\n#define __ADC_H\n\n#include \u0022./SYSTEM/sys/sys.h\u0022\n\n#define ADC_DMA_BUF_SIZE 1 * 1 /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 采样次数*采样通道数 */\n\n/******************************************************************************************/\n/* ADC及引脚 定义 */\n\n#define ADC_ADCX_CHY_GPIO_PORT GPIOB\n#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_0\n#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PA口时钟使能 */\n\n#define ADC_ADCX ADC1 \n#define ADC_ADCX_CHY ADC_CHANNEL_8 /* 通道Y, 0 \u003c= Y \u003c= 17 */ \n#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0) /* ADC1 时钟使能 */\n\n/* ADC单通道/多通道 DMA采集 DMA及通道 定义\n * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的\n * ADC2不支持DMA采集\n * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改\n */\n#define ADC_ADCX_DMACx DMA1_Channel1\n#define ADC_ADCX_DMACx_IRQn DMA1_Channel1_IRQn\n#define ADC_ADCX_DMACx_IRQHandler DMA1_Channel1_IRQHandler\n\n#define ADC_ADCX_DMACx_IS_TC() ( DMA1-\u003eISR \u0026 (1 \u003c\u003c 1) ) /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,\n * 不能当函数使用, 只能用在if等语句里面 \n */\n#define ADC_ADCX_DMACx_CLR_TC() do{ DMA1-\u003eIFCR |= 1 \u003c\u003c 1; }while(0) /* 清除 DMA1_Channel1 传输完成标志 */\n\n#define RP_Init ADC2_Init\n#define RP_GetValue(x) ADC2_get_result(x+1)\n/******************************************************************************************/\n\nvoid adc_init(void); /* ADC初始化 */\nvoid adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch,uint32_t rank, uint32_t stime); /* ADC通道设置 */\nuint32_t adc_get_result(uint32_t ch); /* 获得某个通道值 */\nuint32_t adc_get_result_average(uint32_t ch, uint8_t times); /* 得到某个通道给定次数采样的平均值 */\n\nvoid adc_dma_init(uint32_t mar); /* ADC DMA采集初始化 */\nvoid adc_dma_enable( uint16_t cndtr); /* 使能一次ADC DMA采集传输 */\n\nvoid adc_nch_dma_init(uint32_t mar); /* ADC多通道 DMA采集初始化 */\n\nvoid ADC2_Init();\nuint32_t ADC2_get_result(uint8_t ch);\n\n#endif \n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#ifndef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ADC_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__ADC_H\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_DMA_BUF_SIZE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 采样次数*采样通道数 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* ADC及引脚 定义 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_PORT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIOB\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_PIN\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOB_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* PA口时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC1 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_8\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道Y, 0 \u0026lt;= Y \u0026lt;= 17 */\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_ADC1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(); }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC1 时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/* ADC单通道/多通道 DMA采集 DMA及通道 定义\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * ADC2不支持DMA采集\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1_IRQn\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA1_Channel1_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IS_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() ( DMA1-\u0026gt;ISR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) )\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 不能当函数使用, 只能用在if等语句里面 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_CLR_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e() \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003edo\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{ DMA1-\u0026gt;IFCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e; }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除 DMA1_Channel1 传输完成标志 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC2_Init\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ex\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e) \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(x\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/******************************************************************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadc_handle\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 获得某个通道值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result_average\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 得到某个通道给定次数采样的平均值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC DMA采集初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e( \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ecndtr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能一次ADC DMA采集传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_nch_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC多通道 DMA采集初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#endif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":52,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>
#ifndef __ADC_H
#define __ADC_H

#include "./SYSTEM/sys/sys.h"

#define ADC_DMA_BUF_SIZE 1 * 1 /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 采样次数*采样通道数 */

/******************************************************************************************/
/* ADC及引脚 定义 */

#define ADC_ADCX_CHY_GPIO_PORT GPIOB
#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_0
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PA口时钟使能 */

#define ADC_ADCX ADC1
#define ADC_ADCX_CHY ADC_CHANNEL_8 /* 通道Y, 0 &lt;= Y &lt;= 17 */
#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0) /* ADC1 时钟使能 */

/* ADC单通道/多通道 DMA采集 DMA及通道 定义
* 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的
* ADC2不支持DMA采集
* ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改
*/
#define ADC_ADCX_DMACx DMA1_Channel1
#define ADC_ADCX_DMACx_IRQn DMA1_Channel1_IRQn
#define ADC_ADCX_DMACx_IRQHandler DMA1_Channel1_IRQHandler

#define ADC_ADCX_DMACx_IS_TC() ( DMA1->ISR &amp; (1 &lt;&lt; 1) ) /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,
* 不能当函数使用, 只能用在if等语句里面
*/
#define ADC_ADCX_DMACx_CLR_TC() do{ DMA1->IFCR |= 1 &lt;&lt; 1; }while(0) /* 清除 DMA1_Channel1 传输完成标志 */

#define RP_Init ADC2_Init
#define RP_GetValue(x) ADC2_get_result(x+1)
/******************************************************************************************/

void adc_init(void); /* ADC初始化 */
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch,uint32_t rank, uint32_t stime); /* ADC通道设置 */
uint32_t adc_get_result(uint32_t ch); /* 获得某个通道值 */
uint32_t adc_get_result_average(uint32_t ch, uint8_t times); /* 得到某个通道给定次数采样的平均值 */

void adc_dma_init(uint32_t mar); /* ADC DMA采集初始化 */
void adc_dma_enable( uint16_t cndtr); /* 使能一次ADC DMA采集传输 */

void adc_nch_dma_init(uint32_t mar); /* ADC多通道 DMA采集初始化 */

void ADC2_Init();
uint32_t ADC2_get_result(uint8_t ch);

#endif
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #F47067">#ifndef</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ADC_H</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__ADC_H</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_DMA_BUF_SIZE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #768390"> /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 采样次数*采样通道数 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"><span style="color: #768390">/* ADC及引脚 定义 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_PORT</span><span style="color: #ADBAC7"> GPIOB</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_PIN</span><span style="color: #ADBAC7"> GPIO_PIN_0</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_GPIOB_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* PA口时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX</span><span style="color: #ADBAC7"> ADC1 </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY</span><span style="color: #ADBAC7"> ADC_CHANNEL_8</span><span style="color: #768390"> /* 通道Y, 0 &lt;= Y &lt;= 17 */</span><span style="color: #ADBAC7"> </span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ </span><span style="color: #DCBDFB">__HAL_RCC_ADC1_CLK_ENABLE</span><span style="color: #ADBAC7">(); }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* ADC1 时钟使能 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/* ADC单通道/多通道 DMA采集 DMA及通道 定义</span></span>
<span class="line"><span style="color: #768390"> * 注意: ADC1的DMA通道只能是: DMA1_Channel1, 因此只要是ADC1, 这里是不能改动的</span></span>
<span class="line"><span style="color: #768390"> * ADC2不支持DMA采集</span></span>
<span class="line"><span style="color: #768390"> * ADC3的DMA通道只能是: DMA2_Channel5, 因此如果使用 ADC3 则需要修改</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx</span><span style="color: #ADBAC7"> DMA1_Channel1</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQn</span><span style="color: #ADBAC7"> DMA1_Channel1_IRQn</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQHandler</span><span style="color: #ADBAC7"> DMA1_Channel1_IRQHandler</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IS_TC</span><span style="color: #ADBAC7">() ( DMA1-&gt;ISR </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">) )</span><span style="color: #768390"> /* 判断 DMA1_Channel1 传输完成标志, 这是一个假函数形式,</span></span>
<span class="line"><span style="color: #768390"> * 不能当函数使用, 只能用在if等语句里面 </span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_CLR_TC</span><span style="color: #ADBAC7">() </span><span style="color: #F47067">do</span><span style="color: #ADBAC7">{ DMA1-&gt;IFCR </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">; }</span><span style="color: #F47067">while</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 清除 DMA1_Channel1 传输完成标志 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7"> ADC2_Init</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">x</span><span style="color: #ADBAC7">) </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(x</span><span style="color: #F47067">+</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #768390">/******************************************************************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC初始化 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">adc_handle</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">,</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">rank</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">stime</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC通道设置 */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 获得某个通道值 */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result_average</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">times</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 得到某个通道给定次数采样的平均值 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC DMA采集初始化 */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">( </span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">cndtr</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 使能一次ADC DMA采集传输 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_nch_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* ADC多通道 DMA采集初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#endif</span><span style="color: #ADBAC7"> </span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n\nADC_HandleTypeDef g_adc_handle; /* ADC句柄 */\n\n/**\n * @brief ADC初始化函数\n * @note 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3\n * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期\n * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us\n * @param 无\n * @retval 无\n */\nvoid adc_init(void)\n{\n g_adc_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */\n g_adc_handle.Init.ContinuousConvMode = DISABLE; /* 关闭连续转换模式 */\n g_adc_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */\n g_adc_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */\n HAL_ADC_Init(\u0026g_adc_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026g_adc_handle); /* 校准ADC */\n}\n\n/**\n * @brief ADC底层驱动,引脚配置,时钟使能\n 此函数会被HAL_ADC_Init()调用\n * @param hadc:ADC句柄\n * @retval 无\n */\nvoid HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)\n{\n if(hadc-\u003eInstance == ADC_ADCX)\n {\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026adc_clk_init); /* 设置ADC时钟 */\n\n /* 设置AD采集通道对应IO引脚工作模式 */\n gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道IO引脚 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, \u0026gpio_init_struct);\n }\n}\n\n/**\n * @brief 设置ADC通道采样时间\n * @param adcx : adc句柄指针,ADC_HandleTypeDef\n * @param ch : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17\n * @param stime: 采样时间 0~7, 对应关系为:\n * @arg ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期\n * @arg ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期\n * @param rank: 多通道采集时需要设置的采集编号,\n 假设你定义channle1的rank=1,channle2 的rank=2,\n 那么对应你在DMA缓存空间的变量数组AdcDMA[0] 就i是channle1的转换结果,AdcDMA[1]就是通道2的转换结果。 \n 单通道DMA设置为 ADC_REGULAR_RANK_1\n * @arg 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16\n * @retval 无\n */\nvoid adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)\n{\n ADC_ChannelConfTypeDef adc_ch_conf;\n\n adc_ch_conf.Channel = ch; /* 通道 */\n adc_ch_conf.Rank = rank; /* 序列 */\n adc_ch_conf.SamplingTime = stime; /* 采样时间 */\n HAL_ADC_ConfigChannel(adc_handle, \u0026adc_ch_conf); /* 通道配置 */\n}\n\n/**\n * @brief 获得ADC转换后的结果\n * @param ch: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17\n * @retval 无\n */\nuint32_t adc_get_result(uint32_t ch)\n{\n adc_channel_set(\u0026g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */\n\n HAL_ADC_Start(\u0026g_adc_handle); /* 开启ADC */\n HAL_ADC_PollForConversion(\u0026g_adc_handle, 10); /* 轮询转换 */\n return (uint16_t)HAL_ADC_GetValue(\u0026g_adc_handle); /* 返回最近一次ADC1规则组的转换结果 */\n}\n\n/**\n * @brief 获取通道ch的转换值,取times次,然后平均\n * @param ch : 通道号, 0~17\n * @param times : 获取次数\n * @retval 通道ch的times次转换结果平均值\n */\nuint32_t adc_get_result_average(uint32_t ch, uint8_t times)\n{\n uint32_t temp_val = 0;\n uint8_t t;\n\n for (t = 0; t \u003c times; t++) /* 获取times次数据 */\n {\n temp_val += adc_get_result(ch);\n delay_ms(5);\n }\n\n return temp_val / times; /* 返回平均值 */\n}\n\n/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/\n\nDMA_HandleTypeDef g_dma_adc_handle = {0}; /* 定义要搬运ADC数据的DMA句柄 */\nADC_HandleTypeDef g_adc_dma_handle = {0}; /* 定义ADC(DMA读取)句柄 */\nuint8_t g_adc_dma_sta = 0; /* DMA传输状态标志, 0,未完成; 1, 已完成 */\n\n/**\n * @brief ADC DMA读取 初始化函数\n * @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\n * @param par : 外设地址\n * @param mar : 存储器地址\n * @retval 无\n */\nvoid adc_dma_init(uint32_t mar)\n{\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026adc_clk_init); /* 设置ADC时钟 */\n\n /* 设置AD采集通道对应IO引脚工作模式 */\n gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道对应的IO引脚 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, \u0026gpio_init_struct);\n\n /* 初始化DMA */\n g_dma_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */\n g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */\n g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */\n g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */\n g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */\n g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */\n g_dma_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */\n g_dma_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */\n HAL_DMA_Init(\u0026g_dma_adc_handle);\n\n __HAL_LINKDMA(\u0026g_adc_dma_handle, DMA_Handle, g_dma_adc_handle); /* 将DMA与adc联系起来 */\n\n g_adc_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */\n g_adc_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换模式 */\n g_adc_dma_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */\n g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */\n HAL_ADC_Init(\u0026g_adc_dma_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026g_adc_dma_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_ADCX_CHY; /* 通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 序列 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026g_adc_dma_handle, \u0026adc_ch_conf); /* 通道配置 */\n\n /* 配置DMA数据流请求中断优先级 */\n HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);\n HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);\n\n HAL_DMA_Start_IT(\u0026g_dma_adc_handle, (uint32_t)\u0026ADC1-\u003eDR, mar, 0); /* 启动DMA,并开启中断 */\n HAL_ADC_Start_DMA(\u0026g_adc_dma_handle, \u0026mar, 0); /* 开启ADC,通过DMA传输结果 */\n}\n\n/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\n\nDMA_HandleTypeDef g_dma_nch_adc_handle = {0}; /* 定义要搬运ADC多通道数据的DMA句柄 */\nADC_HandleTypeDef g_adc_nch_dma_handle = {0}; /* 定义ADC(多通道DMA读取)句柄 */\n\n/**\n * @brief ADC N通道(6通道) DMA读取 初始化函数\n * @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\n * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,\n * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.\n *\n * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义\n * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.\n *\n * @param mar : 存储器地址 \n * @retval 无\n */\nvoid adc_nch_dma_init(uint32_t mar)\n{\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */\n __HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026adc_clk_init); /* 设置ADC时钟 */\n\n /* \n 设置ADC1通道0~5对应的IO口模拟输入\n AD采集引脚模式设置,模拟输入\n PA0对应 ADC1_IN0\n PA1对应 ADC1_IN1\n PA2对应 ADC1_IN2\n PA3对应 ADC1_IN3\n PA4对应 ADC1_IN4\n PA5对应 ADC1_IN5\n */\n gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(GPIOA, \u0026gpio_init_struct);\n\n /* 初始化DMA */\n g_dma_nch_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */\n g_dma_nch_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */\n g_dma_nch_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */\n g_dma_nch_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */\n g_dma_nch_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */\n g_dma_nch_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */\n g_dma_nch_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */\n g_dma_nch_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */\n HAL_DMA_Init(\u0026g_dma_nch_adc_handle);\n\n __HAL_LINKDMA(\u0026g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle); /* 将DMA与adc联系起来 */\n\n /* 初始化ADC */\n g_adc_nch_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */\n g_adc_nch_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc_nch_dma_handle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* 使能扫描模式 */\n g_adc_nch_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */\n g_adc_nch_dma_handle.Init.NbrOfConversion = 6; /* 赋值范围是1~16,本实验用到6个规则通道序列 */\n g_adc_nch_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc_nch_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc_nch_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */\n HAL_ADC_Init(\u0026g_adc_nch_dma_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026g_adc_nch_dma_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 通道配置 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */\n HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */\n HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */\n HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */\n// HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */\n// HAL_ADC_ConfigChannel(\u0026g_adc_nch_dma_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n /* 配置DMA数据流请求中断优先级 */\n HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);\n HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);\n\n HAL_DMA_Start_IT(\u0026g_dma_nch_adc_handle, (uint32_t)\u0026ADC1-\u003eDR, mar, 0); /* 启动DMA,并开启中断 */\n HAL_ADC_Start_DMA(\u0026g_adc_nch_dma_handle, \u0026mar, 0); /* 开启ADC,通过DMA传输结果 */\n}\n\n/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\n\n/**\n * @brief 使能一次ADC DMA传输\n * @note 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性\n * @param ndtr: DMA传输的次数\n * @retval 无\n */\nvoid adc_dma_enable(uint16_t cndtr)\n{\n ADC_ADCX-\u003eCR2 \u0026= ~(1 \u003c\u003c 0); /* 先关闭ADC */\n\n ADC_ADCX_DMACx-\u003eCCR \u0026= ~(1 \u003c\u003c 0); /* 关闭DMA传输 */\n while (ADC_ADCX_DMACx-\u003eCCR \u0026 (1 \u003c\u003c 0)); /* 确保DMA可以被设置 */\n ADC_ADCX_DMACx-\u003eCNDTR = cndtr; /* DMA传输数据量 */\n ADC_ADCX_DMACx-\u003eCCR |= 1 \u003c\u003c 0; /* 开启DMA传输 */\n\n ADC_ADCX-\u003eCR2 |= 1 \u003c\u003c 0; /* 重新启动ADC */\n ADC_ADCX-\u003eCR2 |= 1 \u003c\u003c 22; /* 启动规则转换通道 */\n}\n\n/**\n * @brief ADC DMA采集中断服务函数\n * @param 无 \n * @retval 无\n */\nvoid ADC_ADCX_DMACx_IRQHandler(void)\n{\n if (ADC_ADCX_DMACx_IS_TC())\n {\n g_adc_dma_sta = 1; /* 标记DMA传输完成 */\n ADC_ADCX_DMACx_CLR_TC(); /* 清除DMA1 数据流7 传输完成中断 */\n }\n}\n\nADC_HandleTypeDef g_adc2_handle;\nADC_HandleTypeDef g_adc1_handle;\nvoid ADC2_Init(){\n GPIO_InitTypeDef gpio_init_struct;\n RCC_PeriphCLKInitTypeDef adc_clk_init = {0};\n ADC_ChannelConfTypeDef adc_ch_conf = {0};\n\n __HAL_RCC_ADC2_CLK_ENABLE(); /* 使能ADCx时钟 */\n __HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */\n\n if ((uint32_t)ADC_ADCX_DMACx \u003e (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */\n {\n __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */\n }\n else\n {\n __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */\n }\n\n /* 设置ADC时钟 */\n adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */\n adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */\n HAL_RCCEx_PeriphCLKConfig(\u0026adc_clk_init); /* 设置ADC时钟 */\n\n /* \n 设置ADC1通道0~5对应的IO口模拟输入\n AD采集引脚模式设置,模拟输入\n PA0对应 ADC1_IN0\n PA1对应 ADC1_IN1\n PA2对应 ADC1_IN2\n PA3对应 ADC1_IN3\n PA4对应 ADC1_IN4\n PA5对应 ADC1_IN5\n */\n gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */\n gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */\n HAL_GPIO_Init(GPIOA, \u0026gpio_init_struct);\n\n /* 初始化ADC */\n g_adc2_handle.Instance = ADC2; /* 选择哪个ADC */\n g_adc2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */\n g_adc2_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 使能扫描模式 */\n g_adc2_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */\n g_adc2_handle.Init.NbrOfConversion = 4; /* 赋值范围是1~16,本实验用到6个规则通道序列 */\n g_adc2_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */\n g_adc2_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\n g_adc2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */\n HAL_ADC_Init(\u0026g_adc2_handle); /* 初始化 */\n\n HAL_ADCEx_Calibration_Start(\u0026g_adc2_handle); /* 校准ADC */\n\n /* 配置ADC通道 */\n adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */\n adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */\n HAL_ADC_ConfigChannel(\u0026g_adc2_handle, \u0026adc_ch_conf); /* 通道配置 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */\n HAL_ADC_ConfigChannel(\u0026g_adc2_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */\n HAL_ADC_ConfigChannel(\u0026g_adc2_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\n adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */\n HAL_ADC_ConfigChannel(\u0026g_adc2_handle, \u0026adc_ch_conf); /* 配置ADC通道 */\n\n HAL_ADC_Start_IT(\u0026g_adc2_handle); //开启转换并触发中断\n HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); // 设置中断优先级\n HAL_NVIC_EnableIRQ(ADC1_2_IRQn); // 使能 ADC1 和 ADC2 的中断\n}\n\nvoid HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)\n{\n// static uint8_t ADC2CH=0;\n// if (hadc-\u003eInstance == ADC2)\n// {\n// \n// g_adc_dma_buf[ADC2CH++] = HAL_ADC_GetValue(hadc);\n// if(ADC2CH==4)ADC2CH=0;\n// \n// }\n}\n\nvoid ADC1_2_IRQHandler(void)\n{\n if (__HAL_ADC_GET_FLAG(\u0026g_adc2_handle, ADC_FLAG_EOC) != RESET)\n {\n HAL_ADC_IRQHandler(\u0026g_adc2_handle); // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler\n }\n\n // 检查 ADC2 是否触发了中断\n if (__HAL_ADC_GET_FLAG(\u0026g_adc1_handle, ADC_FLAG_EOC) != RESET)\n {\n HAL_ADC_IRQHandler(\u0026g_adc1_handle); // 将 adc1 的地址传递给 HAL_ADC_IRQHandler\n }\n}\n\nuint32_t ADC2_get_result(uint8_t ch)\n{\n adc_channel_set(\u0026g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */\n\n HAL_ADC_Start(\u0026g_adc2_handle); /* 开启ADC */\n HAL_ADC_PollForConversion(\u0026g_adc2_handle, 10); /* 轮询转换 */\n return (uint16_t)HAL_ADC_GetValue(\u0026g_adc2_handle); /* 返回最近一次ADC1规则组的转换结果 */\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_handle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 非扫描模式,仅用到一个通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 关闭连续转换模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到1个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 触发转换方式:软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC底层驱动,引脚配置,时钟使能\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 此函数会被HAL_ADC_Init()调用\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e:ADC句柄\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_MspInit\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(hadc-\u0026gt;Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIO时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置AD采集通道对应IO引脚工作模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道IO引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC通道采样时间\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadcx\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : adc句柄指针,ADC_HandleTypeDef\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 采样时间 0~7, 对应关系为:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 多通道采集时需要设置的采集编号,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 假设你定义channle1的rank=1,channle2 的rank=2,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 那么对应你在DMA缓存空间的变量数组AdcDMA\u0026#91;0\u0026#93; 就i是channle1的转换结果,AdcDMA\u0026#91;1\u0026#93;就是通道2的转换结果。 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 单通道DMA设置为 ADC_REGULAR_RANK_1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@arg\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eadc_handle\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003erank\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003estime\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ch;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e rank;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e stime;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(adc_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 获得ADC转换后的结果\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置通道,序列和采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_PollForConversion\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 轮询转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回最近一次ADC1规则组的转换结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 获取通道ch的转换值,取times次,然后平均\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 通道号, 0~17\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 获取次数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 通道ch的times次转换结果平均值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result_average\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003etimes\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e t;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efor\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (t \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e; t \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e times; t\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 获取times次数据 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ch);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e temp_val \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e times;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回平均值 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eDMA_HandleTypeDef g_dma_adc_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义要搬运ADC数据的DMA句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_dma_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义ADC(DMA读取)句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA传输状态标志, 0,未完成; 1, 已完成 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC DMA读取 初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 外设地址\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 存储器地址\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_GPIO_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIO时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置AD采集通道对应IO引脚工作模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY_GPIO_PIN;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC通道对应的IO引脚 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_CHY_GPIO_PORT, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化DMA */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置DMA通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Direction \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PERIPH_TO_MEMORY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 从外设到存储器模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.PeriphInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PINC_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设非增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.MemInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MINC_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.PeriphDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.MemDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_NORMAL;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设流控模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_adc_handle.Init.Priority \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PRIORITY_MEDIUM;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 中等优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_adc_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_LINKDMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, DMA_Handle, g_dma_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 将DMA与adc联系起来 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 非扫描模式,仅用到一个通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到1个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 触发转换方式:软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_CHY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置DMA数据流请求中断优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_adc_handle, (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC1-\u0026gt;DR, mar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动DMA,并开启中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_DMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003emar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC,通过DMA传输结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eDMA_HandleTypeDef g_dma_nch_adc_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义要搬运ADC多通道数据的DMA句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc_nch_dma_handle \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 定义ADC(多通道DMA读取)句柄 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC N通道(6通道) DMA读取 初始化函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e *\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e : 存储器地址 \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_nch_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003emar\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_CHY_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIOA时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC1通道0~5对应的IO口模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e AD采集引脚模式设置,模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA0对应 ADC1_IN0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA1对应 ADC1_IN1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA2对应 ADC1_IN2\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA3对应 ADC1_IN3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA4对应 ADC1_IN4\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA5对应 ADC1_IN5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_3\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_4\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* GPIOA0~5 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化DMA */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置DMA通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Direction \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PERIPH_TO_MEMORY;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 从外设到存储器模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.PeriphInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PINC_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设非增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.MemInc \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MINC_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器增量模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.PeriphDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.MemDataAlignment \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_MDATAALIGN_HALFWORD;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 存储器数据长度:16位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_NORMAL;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 外设流控模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_dma_nch_adc_handle.Init.Priority \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DMA_PRIORITY_MEDIUM;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 中等优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_nch_adc_handle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_LINKDMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 将DMA与adc联系起来 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能扫描模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e6\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到6个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_nch_dma_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第1个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第2个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第3个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第4个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// HAL_ADC_ConfigChannel(\u0026amp;g_adc_nch_dma_handle, \u0026amp;adc_ch_conf); /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置DMA数据流请求中断优先级 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_ADCX_DMACx_IRQn);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_DMA_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_dma_nch_adc_handle, (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC1-\u0026gt;DR, mar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动DMA,并开启中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_DMA\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc_nch_dma_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003emar, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC,通过DMA传输结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 使能一次ADC DMA传输\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@note\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003endtr\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e: DMA传输的次数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ecndtr\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e~\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 先关闭ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e~\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 关闭DMA传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e));\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 确保DMA可以被设置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CNDTR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e cndtr;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA传输数据量 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX_DMACx-\u0026gt;CCR \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启DMA传输 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 重新启动ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ADCX-\u0026gt;CR2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e22\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 启动规则转换通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e/**\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@brief\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e ADC DMA采集中断服务函数\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@param\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003e无\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e * \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e@retval\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 无\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_IS_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e())\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc_dma_sta \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 标记DMA传输完成 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC_ADCX_DMACx_CLR_TC\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除DMA1 数据流7 传输完成中断 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc2_handle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eADC_HandleTypeDef g_adc1_handle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_InitTypeDef gpio_init_struct;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PeriphCLKInitTypeDef adc_clk_init \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_ChannelConfTypeDef adc_ch_conf \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_ADC2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能ADCx时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_GPIOA_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启GPIOA时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)ADC_ADCX_DMACx \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)DMA1_Channel7)\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 大于DMA1_Channel7, 则为DMA2的通道了 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA2_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA2时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_RCC_DMA1_CLK_ENABLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* DMA1时钟使能 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.PeriphClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_PERIPHCLK_ADC;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* ADC外设时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_clk_init.AdcClockSelection \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RCC_ADCPCLK2_DIV6;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 分频因子6时钟为72M/6=12MHz */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_RCCEx_PeriphCLKConfig\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_clk_init);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置ADC时钟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e 设置ADC1通道0~5对应的IO口模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e AD采集引脚模式设置,模拟输入\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA0对应 ADC1_IN0\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA1对应 ADC1_IN1\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA2对应 ADC1_IN2\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA3对应 ADC1_IN3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA4对应 ADC1_IN4\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e PA5对应 ADC1_IN5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Pin \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_PIN_0\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_3\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_4\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e|\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eGPIO_PIN_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* GPIOA0~5 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e gpio_init_struct.Mode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e GPIO_MODE_ANALOG;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 模拟 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(GPIOA, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003egpio_init_struct);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Instance \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 选择哪个ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.DataAlign \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_DATAALIGN_RIGHT;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 数据对齐方式:右对齐 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ScanConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SCAN_DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能扫描模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ContinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ENABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 使能连续转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.NbrOfConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 赋值范围是1~16,本实验用到6个规则通道序列 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.DiscontinuousConvMode \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e DISABLE;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 禁止规则通道组间断模式 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.NbrOfDiscConversion \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e g_adc2_handle.Init.ExternalTrigConv \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SOFTWARE_START;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 软件触发 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 初始化 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADCEx_Calibration_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 校准ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_1;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第1个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.SamplingTime \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_SAMPLETIME_239CYCLES_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样时间,设置最大采样周期:239.5个ADC周期 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 通道配置 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_2;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第2个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_3;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第3个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Channel \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_CHANNEL_5;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置使用的ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e adc_ch_conf.Rank \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e ADC_REGULAR_RANK_4;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 采样序列里的第4个 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConfigChannel\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eadc_ch_conf);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 配置ADC通道 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //开启转换并触发中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_SetPriority\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC1_2_IRQn, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 设置中断优先级\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_NVIC_EnableIRQ\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC1_2_IRQn);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 使能 ADC1 和 ADC2 的中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_ConvCpltCallback\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(ADC_HandleTypeDef\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ehadc\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// static uint8_t ADC2CH=0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// if (hadc-\u0026gt;Instance == ADC2)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// g_adc_dma_buf\u0026#91;ADC2CH++\u0026#93; = HAL_ADC_GetValue(hadc);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// if(ADC2CH==4)ADC2CH=0;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// \u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC1_2_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_ADC_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, ADC_FLAG_EOC) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// 检查 ADC2 是否触发了中断\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_ADC_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc1_handle, ADC_FLAG_EOC) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RESET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc1_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e // 将 adc1 的地址传递给 HAL_ADC_IRQHandler\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eADC2_get_result\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003ech\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_channel_set\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 设置通道,序列和采样时间 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_Start\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 开启ADC */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_PollForConversion\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle, \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e10\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 轮询转换 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ereturn\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_ADC_GetValue\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_adc2_handle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 返回最近一次ADC1规则组的转换结果 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":454,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include "./BSP/ADC/adc.h"
#include "./SYSTEM/delay/delay.h"

ADC_HandleTypeDef g_adc_handle; /* ADC句柄 */

/**
* @brief ADC初始化函数
* @note 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3
* 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期
* 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us
* @param 无
* @retval 无
*/
void adc_init(void)
{
g_adc_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */
g_adc_handle.Init.ContinuousConvMode = DISABLE; /* 关闭连续转换模式 */
g_adc_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */
g_adc_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */
HAL_ADC_Init(&amp;g_adc_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_handle); /* 校准ADC */
}

/**
* @brief ADC底层驱动,引脚配置,时钟使能
此函数会被HAL_ADC_Init()调用
* @param hadc:ADC句柄
* @retval 无
*/
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
if(hadc->Instance == ADC_ADCX)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/* 设置AD采集通道对应IO引脚工作模式 */
gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道IO引脚 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &amp;gpio_init_struct);
}
}

/**
* @brief 设置ADC通道采样时间
* @param adcx : adc句柄指针,ADC_HandleTypeDef
* @param ch : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17
* @param stime: 采样时间 0~7, 对应关系为:
* @arg ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期
* @arg ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期
* @arg ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期
* @arg ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期
* @param rank: 多通道采集时需要设置的采集编号,
假设你定义channle1的rank=1,channle2 的rank=2,
那么对应你在DMA缓存空间的变量数组AdcDMA&#91;0&#93; 就i是channle1的转换结果,AdcDMA&#91;1&#93;就是通道2的转换结果。
单通道DMA设置为 ADC_REGULAR_RANK_1
* @arg 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16
* @retval 无
*/
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
{
ADC_ChannelConfTypeDef adc_ch_conf;

adc_ch_conf.Channel = ch; /* 通道 */
adc_ch_conf.Rank = rank; /* 序列 */
adc_ch_conf.SamplingTime = stime; /* 采样时间 */
HAL_ADC_ConfigChannel(adc_handle, &amp;adc_ch_conf); /* 通道配置 */
}

/**
* @brief 获得ADC转换后的结果
* @param ch: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17
* @retval 无
*/
uint32_t adc_get_result(uint32_t ch)
{
adc_channel_set(&amp;g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */

HAL_ADC_Start(&amp;g_adc_handle); /* 开启ADC */
HAL_ADC_PollForConversion(&amp;g_adc_handle, 10); /* 轮询转换 */
return (uint16_t)HAL_ADC_GetValue(&amp;g_adc_handle); /* 返回最近一次ADC1规则组的转换结果 */
}

/**
* @brief 获取通道ch的转换值,取times次,然后平均
* @param ch : 通道号, 0~17
* @param times : 获取次数
* @retval 通道ch的times次转换结果平均值
*/
uint32_t adc_get_result_average(uint32_t ch, uint8_t times)
{
uint32_t temp_val = 0;
uint8_t t;

for (t = 0; t &lt; times; t++) /* 获取times次数据 */
{
temp_val += adc_get_result(ch);
delay_ms(5);
}

return temp_val / times; /* 返回平均值 */
}

/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/

DMA_HandleTypeDef g_dma_adc_handle = {0}; /* 定义要搬运ADC数据的DMA句柄 */
ADC_HandleTypeDef g_adc_dma_handle = {0}; /* 定义ADC(DMA读取)句柄 */
uint8_t g_adc_dma_sta = 0; /* DMA传输状态标志, 0,未完成; 1, 已完成 */

/**
* @brief ADC DMA读取 初始化函数
* @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置
* @param par : 外设地址
* @param mar : 存储器地址
* @retval 无
*/
void adc_dma_init(uint32_t mar)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/* 设置AD采集通道对应IO引脚工作模式 */
gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN; /* ADC通道对应的IO引脚 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &amp;gpio_init_struct);

/* 初始化DMA */
g_dma_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */
g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */
g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */
g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */
g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */
g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */
g_dma_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */
g_dma_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */
HAL_DMA_Init(&amp;g_dma_adc_handle);

__HAL_LINKDMA(&amp;g_adc_dma_handle, DMA_Handle, g_dma_adc_handle); /* 将DMA与adc联系起来 */

g_adc_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 非扫描模式,仅用到一个通道 */
g_adc_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换模式 */
g_adc_dma_handle.Init.NbrOfConversion = 1; /* 赋值范围是1~16,本实验用到1个规则通道序列 */
g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 触发转换方式:软件触发 */
HAL_ADC_Init(&amp;g_adc_dma_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_dma_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_ADCX_CHY; /* 通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 序列 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc_dma_handle, &amp;adc_ch_conf); /* 通道配置 */

/* 配置DMA数据流请求中断优先级 */
HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);

HAL_DMA_Start_IT(&amp;g_dma_adc_handle, (uint32_t)&amp;ADC1->DR, mar, 0); /* 启动DMA,并开启中断 */
HAL_ADC_Start_DMA(&amp;g_adc_dma_handle, &amp;mar, 0); /* 开启ADC,通过DMA传输结果 */
}

/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/

DMA_HandleTypeDef g_dma_nch_adc_handle = {0}; /* 定义要搬运ADC多通道数据的DMA句柄 */
ADC_HandleTypeDef g_adc_nch_dma_handle = {0}; /* 定义ADC(多通道DMA读取)句柄 */

/**
* @brief ADC N通道(6通道) DMA读取 初始化函数
* @note 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置
* 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,
* 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.
*
* 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义
* 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.
*
* @param mar : 存储器地址
* @retval 无
*/
void adc_nch_dma_init(uint32_t mar)
{
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

ADC_ADCX_CHY_CLK_ENABLE(); /* 使能ADCx时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/*
设置ADC1通道0~5对应的IO口模拟输入
AD采集引脚模式设置,模拟输入
PA0对应 ADC1_IN0
PA1对应 ADC1_IN1
PA2对应 ADC1_IN2
PA3对应 ADC1_IN3
PA4对应 ADC1_IN4
PA5对应 ADC1_IN5
*/
gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct);

/* 初始化DMA */
g_dma_nch_adc_handle.Instance = ADC_ADCX_DMACx; /* 设置DMA通道 */
g_dma_nch_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 从外设到存储器模式 */
g_dma_nch_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */
g_dma_nch_adc_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */
g_dma_nch_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据长度:16位 */
g_dma_nch_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据长度:16位 */
g_dma_nch_adc_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */
g_dma_nch_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */
HAL_DMA_Init(&amp;g_dma_nch_adc_handle);

__HAL_LINKDMA(&amp;g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle); /* 将DMA与adc联系起来 */

/* 初始化ADC */
g_adc_nch_dma_handle.Instance = ADC_ADCX; /* 选择哪个ADC */
g_adc_nch_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc_nch_dma_handle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* 使能扫描模式 */
g_adc_nch_dma_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */
g_adc_nch_dma_handle.Init.NbrOfConversion = 6; /* 赋值范围是1~16,本实验用到6个规则通道序列 */
g_adc_nch_dma_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc_nch_dma_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc_nch_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */
HAL_ADC_Init(&amp;g_adc_nch_dma_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc_nch_dma_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 通道配置 */

adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */
HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */
// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */
// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

/* 配置DMA数据流请求中断优先级 */
HAL_NVIC_SetPriority(ADC_ADCX_DMACx_IRQn, 3, 3);
HAL_NVIC_EnableIRQ(ADC_ADCX_DMACx_IRQn);

HAL_DMA_Start_IT(&amp;g_dma_nch_adc_handle, (uint32_t)&amp;ADC1->DR, mar, 0); /* 启动DMA,并开启中断 */
HAL_ADC_Start_DMA(&amp;g_adc_nch_dma_handle, &amp;mar, 0); /* 开启ADC,通过DMA传输结果 */
}

/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/

/**
* @brief 使能一次ADC DMA传输
* @note 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性
* @param ndtr: DMA传输的次数
* @retval 无
*/
void adc_dma_enable(uint16_t cndtr)
{
ADC_ADCX->CR2 &amp;= ~(1 &lt;&lt; 0); /* 先关闭ADC */

ADC_ADCX_DMACx->CCR &amp;= ~(1 &lt;&lt; 0); /* 关闭DMA传输 */
while (ADC_ADCX_DMACx->CCR &amp; (1 &lt;&lt; 0)); /* 确保DMA可以被设置 */
ADC_ADCX_DMACx->CNDTR = cndtr; /* DMA传输数据量 */
ADC_ADCX_DMACx->CCR |= 1 &lt;&lt; 0; /* 开启DMA传输 */

ADC_ADCX->CR2 |= 1 &lt;&lt; 0; /* 重新启动ADC */
ADC_ADCX->CR2 |= 1 &lt;&lt; 22; /* 启动规则转换通道 */
}

/**
* @brief ADC DMA采集中断服务函数
* @param 无
* @retval 无
*/
void ADC_ADCX_DMACx_IRQHandler(void)
{
if (ADC_ADCX_DMACx_IS_TC())
{
g_adc_dma_sta = 1; /* 标记DMA传输完成 */
ADC_ADCX_DMACx_CLR_TC(); /* 清除DMA1 数据流7 传输完成中断 */
}
}

ADC_HandleTypeDef g_adc2_handle;
ADC_HandleTypeDef g_adc1_handle;
void ADC2_Init(){
GPIO_InitTypeDef gpio_init_struct;
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
ADC_ChannelConfTypeDef adc_ch_conf = {0};

__HAL_RCC_ADC2_CLK_ENABLE(); /* 使能ADCx时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 开启GPIOA时钟 */

if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 则为DMA2的通道了 */
{
__HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2时钟使能 */
}
else
{
__HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1时钟使能 */
}

/* 设置ADC时钟 */
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; /* ADC外设时钟 */
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; /* 分频因子6时钟为72M/6=12MHz */
HAL_RCCEx_PeriphCLKConfig(&amp;adc_clk_init); /* 设置ADC时钟 */

/*
设置ADC1通道0~5对应的IO口模拟输入
AD采集引脚模式设置,模拟输入
PA0对应 ADC1_IN0
PA1对应 ADC1_IN1
PA2对应 ADC1_IN2
PA3对应 ADC1_IN3
PA4对应 ADC1_IN4
PA5对应 ADC1_IN5
*/
gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; /* GPIOA0~5 */
gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模拟 */
HAL_GPIO_Init(GPIOA, &amp;gpio_init_struct);

/* 初始化ADC */
g_adc2_handle.Instance = ADC2; /* 选择哪个ADC */
g_adc2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 数据对齐方式:右对齐 */
g_adc2_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* 使能扫描模式 */
g_adc2_handle.Init.ContinuousConvMode = ENABLE; /* 使能连续转换 */
g_adc2_handle.Init.NbrOfConversion = 4; /* 赋值范围是1~16,本实验用到6个规则通道序列 */
g_adc2_handle.Init.DiscontinuousConvMode = DISABLE; /* 禁止规则通道组间断模式 */
g_adc2_handle.Init.NbrOfDiscConversion = 0; /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */
g_adc2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* 软件触发 */
HAL_ADC_Init(&amp;g_adc2_handle); /* 初始化 */

HAL_ADCEx_Calibration_Start(&amp;g_adc2_handle); /* 校准ADC */

/* 配置ADC通道 */
adc_ch_conf.Channel = ADC_CHANNEL_2; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_1; /* 采样序列里的第1个 */
adc_ch_conf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; /* 采样时间,设置最大采样周期:239.5个ADC周期 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 通道配置 */

adc_ch_conf.Channel = ADC_CHANNEL_3; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_2; /* 采样序列里的第2个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_3; /* 采样序列里的第3个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */
adc_ch_conf.Rank = ADC_REGULAR_RANK_4; /* 采样序列里的第4个 */
HAL_ADC_ConfigChannel(&amp;g_adc2_handle, &amp;adc_ch_conf); /* 配置ADC通道 */

HAL_ADC_Start_IT(&amp;g_adc2_handle); //开启转换并触发中断
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(ADC1_2_IRQn); // 使能 ADC1 和 ADC2 的中断
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
// static uint8_t ADC2CH=0;
// if (hadc->Instance == ADC2)
// {
//
// g_adc_dma_buf&#91;ADC2CH++&#93; = HAL_ADC_GetValue(hadc);
// if(ADC2CH==4)ADC2CH=0;
//
// }
}

void ADC1_2_IRQHandler(void)
{
if (__HAL_ADC_GET_FLAG(&amp;g_adc2_handle, ADC_FLAG_EOC) != RESET)
{
HAL_ADC_IRQHandler(&amp;g_adc2_handle); // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler
}

// 检查 ADC2 是否触发了中断
if (__HAL_ADC_GET_FLAG(&amp;g_adc1_handle, ADC_FLAG_EOC) != RESET)
{
HAL_ADC_IRQHandler(&amp;g_adc1_handle); // 将 adc1 的地址传递给 HAL_ADC_IRQHandler
}
}

uint32_t ADC2_get_result(uint8_t ch)
{
adc_channel_set(&amp;g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5); /* 设置通道,序列和采样时间 */

HAL_ADC_Start(&amp;g_adc2_handle); /* 开启ADC */
HAL_ADC_PollForConversion(&amp;g_adc2_handle, 10); /* 轮询转换 */
return (uint16_t)HAL_ADC_GetValue(&amp;g_adc2_handle); /* 返回最近一次ADC1规则组的转换结果 */
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_handle;</span><span style="color: #768390"> /* ADC句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数支持ADC1/ADC2任意通道, 但是不支持ADC3</span></span>
<span class="line"><span style="color: #768390"> * 我们使用12位精度, ADC采样时钟=12M, 转换时间为: 采样周期 + 12.5个ADC周期</span></span>
<span class="line"><span style="color: #768390"> * 设置最大采样周期: 239.5, 则转换时间 = 252 个ADC周期 = 21us</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 非扫描模式,仅用到一个通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 关闭连续转换模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到1个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 触发转换方式:软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC底层驱动,引脚配置,时钟使能</span></span>
<span class="line"><span style="color: #768390"> 此函数会被HAL_ADC_Init()调用</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">hadc</span><span style="color: #768390">:ADC句柄</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_MspInit</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">hadc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(hadc-&gt;Instance </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> ADC_ADCX)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIO时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置AD采集通道对应IO引脚工作模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY_GPIO_PIN;</span><span style="color: #768390"> /* ADC通道IO引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(ADC_ADCX_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 设置ADC通道采样时间</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">adcx</span><span style="color: #768390"> : adc句柄指针,ADC_HandleTypeDef</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390"> : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">stime</span><span style="color: #768390">: 采样时间 0~7, 对应关系为:</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_1CYCLE_5, 1.5个ADC时钟周期 ADC_SAMPLETIME_7CYCLES_5, 7.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_13CYCLES_5, 13.5个ADC时钟周期 ADC_SAMPLETIME_28CYCLES_5, 28.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_41CYCLES_5, 41.5个ADC时钟周期 ADC_SAMPLETIME_55CYCLES_5, 55.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> ADC_SAMPLETIME_71CYCLES_5, 71.5个ADC时钟周期 ADC_SAMPLETIME_239CYCLES_5, 239.5个ADC时钟周期</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">rank</span><span style="color: #768390">: 多通道采集时需要设置的采集编号,</span></span>
<span class="line"><span style="color: #768390"> 假设你定义channle1的rank=1,channle2 的rank=2,</span></span>
<span class="line"><span style="color: #768390"> 那么对应你在DMA缓存空间的变量数组AdcDMA&#91;0&#93; 就i是channle1的转换结果,AdcDMA&#91;1&#93;就是通道2的转换结果。 </span></span>
<span class="line"><span style="color: #768390"> 单通道DMA设置为 ADC_REGULAR_RANK_1</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@arg</span><span style="color: #768390"> 编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(ADC_HandleTypeDef </span><span style="color: #F47067">*</span><span style="color: #F69D50">adc_handle</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">rank</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">stime</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ch;</span><span style="color: #768390"> /* 通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> rank;</span><span style="color: #768390"> /* 序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> stime;</span><span style="color: #768390"> /* 采样时间 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(adc_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 获得ADC转换后的结果</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390">: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);</span><span style="color: #768390"> /* 设置通道,序列和采样时间 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 开启ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_PollForConversion</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle, </span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 轮询转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7">)</span><span style="color: #DCBDFB">HAL_ADC_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_handle);</span><span style="color: #768390"> /* 返回最近一次ADC1规则组的转换结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 获取通道ch的转换值,取times次,然后平均</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ch</span><span style="color: #768390"> : 通道号, 0~17</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">times</span><span style="color: #768390"> : 获取次数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 通道ch的times次转换结果平均值</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result_average</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">, </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">times</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> t;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">for</span><span style="color: #ADBAC7"> (t </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">; t </span><span style="color: #F47067">&lt;</span><span style="color: #ADBAC7"> times; t</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">)</span><span style="color: #768390"> /* 获取times次数据 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">+=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_get_result</span><span style="color: #ADBAC7">(ch);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> temp_val </span><span style="color: #F47067">/</span><span style="color: #ADBAC7"> times;</span><span style="color: #768390"> /* 返回平均值 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/***************************************单通道ADC采集(DMA读取)实验代码*****************************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">DMA_HandleTypeDef g_dma_adc_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义要搬运ADC数据的DMA句柄 */</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_dma_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义ADC(DMA读取)句柄 */</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> g_adc_dma_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* DMA传输状态标志, 0,未完成; 1, 已完成 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC DMA读取 初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">par</span><span style="color: #768390"> : 外设地址</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">mar</span><span style="color: #768390"> : 存储器地址</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_GPIO_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIO时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置AD采集通道对应IO引脚工作模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY_GPIO_PIN;</span><span style="color: #768390"> /* ADC通道对应的IO引脚 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(ADC_ADCX_CHY_GPIO_PORT, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化DMA */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_DMACx;</span><span style="color: #768390"> /* 设置DMA通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Direction </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PERIPH_TO_MEMORY;</span><span style="color: #768390"> /* 从外设到存储器模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.PeriphInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PINC_DISABLE;</span><span style="color: #768390"> /* 外设非增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.MemInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MINC_ENABLE;</span><span style="color: #768390"> /* 存储器增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.PeriphDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 外设数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.MemDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 存储器数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_NORMAL;</span><span style="color: #768390"> /* 外设流控模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_adc_handle.Init.Priority </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PRIORITY_MEDIUM;</span><span style="color: #768390"> /* 中等优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_adc_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_LINKDMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, DMA_Handle, g_dma_adc_handle);</span><span style="color: #768390"> /* 将DMA与adc联系起来 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 非扫描模式,仅用到一个通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到1个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 触发转换方式:软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_CHY;</span><span style="color: #768390"> /* 通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置DMA数据流请求中断优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_adc_handle, (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">ADC1-&gt;DR, mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 启动DMA,并开启中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_DMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 开启ADC,通过DMA传输结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">DMA_HandleTypeDef g_dma_nch_adc_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义要搬运ADC多通道数据的DMA句柄 */</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc_nch_dma_handle </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span><span style="color: #768390"> /* 定义ADC(多通道DMA读取)句柄 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC N通道(6通道) DMA读取 初始化函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置</span></span>
<span class="line"><span style="color: #768390"> * 另外,由于本函数用到了6个通道, 宏定义会比较多内容, 因此,本函数就不采用宏定义的方式来修改通道了,</span></span>
<span class="line"><span style="color: #768390"> * 直接在本函数里面修改, 这里我们默认使用PA0~PA5这6个通道.</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * 注意: 本函数还是使用 ADC_ADCX(默认=ADC1) 和 ADC_ADCX_DMACx( DMA1_Channel1 ) 及其相关定义</span></span>
<span class="line"><span style="color: #768390"> * 不要乱修改adc.h里面的这两部分内容, 必须在理解原理的基础上进行修改, 否则可能导致无法正常使用.</span></span>
<span class="line"><span style="color: #768390"> *</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">mar</span><span style="color: #768390"> : 存储器地址 </span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_nch_dma_init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">mar</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_CHY_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIOA时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* </span></span>
<span class="line"><span style="color: #768390"> 设置ADC1通道0~5对应的IO口模拟输入</span></span>
<span class="line"><span style="color: #768390"> AD采集引脚模式设置,模拟输入</span></span>
<span class="line"><span style="color: #768390"> PA0对应 ADC1_IN0</span></span>
<span class="line"><span style="color: #768390"> PA1对应 ADC1_IN1</span></span>
<span class="line"><span style="color: #768390"> PA2对应 ADC1_IN2</span></span>
<span class="line"><span style="color: #768390"> PA3对应 ADC1_IN3</span></span>
<span class="line"><span style="color: #768390"> PA4对应 ADC1_IN4</span></span>
<span class="line"><span style="color: #768390"> PA5对应 ADC1_IN5</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_0</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_1</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_2</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_3</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_4</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_5;</span><span style="color: #768390"> /* GPIOA0~5 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化DMA */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX_DMACx;</span><span style="color: #768390"> /* 设置DMA通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Direction </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PERIPH_TO_MEMORY;</span><span style="color: #768390"> /* 从外设到存储器模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.PeriphInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PINC_DISABLE;</span><span style="color: #768390"> /* 外设非增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.MemInc </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MINC_ENABLE;</span><span style="color: #768390"> /* 存储器增量模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.PeriphDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 外设数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.MemDataAlignment </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_MDATAALIGN_HALFWORD;</span><span style="color: #768390"> /* 存储器数据长度:16位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_NORMAL;</span><span style="color: #768390"> /* 外设流控模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_dma_nch_adc_handle.Init.Priority </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DMA_PRIORITY_MEDIUM;</span><span style="color: #768390"> /* 中等优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_nch_adc_handle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_LINKDMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, DMA_Handle, g_dma_nch_adc_handle);</span><span style="color: #768390"> /* 将DMA与adc联系起来 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_ADCX;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_ENABLE;</span><span style="color: #768390"> /* 使能扫描模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">6</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到6个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_nch_dma_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_2;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 采样序列里的第1个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_3;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_2;</span><span style="color: #768390"> /* 采样序列里的第2个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_4;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_3;</span><span style="color: #768390"> /* 采样序列里的第3个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_5;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_4;</span><span style="color: #768390"> /* 采样序列里的第4个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Channel = ADC_CHANNEL_4; /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Rank = ADC_REGULAR_RANK_5; /* 采样序列里的第5个 */</span></span>
<span class="line"><span style="color: #768390">// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Channel = ADC_CHANNEL_5; /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #768390">// adc_ch_conf.Rank = ADC_REGULAR_RANK_6; /* 采样序列里的第6个 */</span></span>
<span class="line"><span style="color: #768390">// HAL_ADC_ConfigChannel(&amp;g_adc_nch_dma_handle, &amp;adc_ch_conf); /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置DMA数据流请求中断优先级 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC_ADCX_DMACx_IRQn);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_DMA_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_dma_nch_adc_handle, (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">ADC1-&gt;DR, mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 启动DMA,并开启中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_DMA</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc_nch_dma_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">mar, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 开启ADC,通过DMA传输结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/*************************单通道ADC采集(DMA读取)实验和多通道ADC采集(DMA读取)实验公用代码*******************************/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> 使能一次ADC DMA传输</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@note</span><span style="color: #768390"> 该函数用寄存器来操作,防止用HAL库操作对其他参数有修改,也为了兼容性</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">ndtr</span><span style="color: #768390">: DMA传输的次数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">cndtr</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">&amp;=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">~</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 先关闭ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">&amp;=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">~</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 关闭DMA传输 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">));</span><span style="color: #768390"> /* 确保DMA可以被设置 */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CNDTR </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> cndtr;</span><span style="color: #768390"> /* DMA传输数据量 */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX_DMACx-&gt;CCR </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 开启DMA传输 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 重新启动ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ADCX-&gt;CR2 </span><span style="color: #F47067">|=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">22</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 启动规则转换通道 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">/**</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@brief</span><span style="color: #768390"> ADC DMA采集中断服务函数</span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@param</span><span style="color: #768390"> </span><span style="color: #F69D50">无</span><span style="color: #768390"> </span></span>
<span class="line"><span style="color: #768390"> * </span><span style="color: #F47067">@retval</span><span style="color: #768390"> 无</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">ADC_ADCX_DMACx_IS_TC</span><span style="color: #ADBAC7">())</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc_dma_sta </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 标记DMA传输完成 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC_ADCX_DMACx_CLR_TC</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 清除DMA1 数据流7 传输完成中断 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc2_handle;</span></span>
<span class="line"><span style="color: #ADBAC7">ADC_HandleTypeDef g_adc1_handle;</span></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_Init</span><span style="color: #ADBAC7">(){</span></span>
<span class="line"><span style="color: #ADBAC7"> GPIO_InitTypeDef gpio_init_struct;</span></span>
<span class="line"><span style="color: #ADBAC7"> RCC_PeriphCLKInitTypeDef adc_clk_init </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"><span style="color: #ADBAC7"> ADC_ChannelConfTypeDef adc_ch_conf </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_ADC2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 使能ADCx时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_GPIOA_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* 开启GPIOA时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> ((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)ADC_ADCX_DMACx </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)DMA1_Channel7)</span><span style="color: #768390"> /* 大于DMA1_Channel7, 则为DMA2的通道了 */</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA2_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA2时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">else</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_RCC_DMA1_CLK_ENABLE</span><span style="color: #ADBAC7">();</span><span style="color: #768390"> /* DMA1时钟使能 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.PeriphClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_PERIPHCLK_ADC;</span><span style="color: #768390"> /* ADC外设时钟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_clk_init.AdcClockSelection </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> RCC_ADCPCLK2_DIV6;</span><span style="color: #768390"> /* 分频因子6时钟为72M/6=12MHz */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_RCCEx_PeriphCLKConfig</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_clk_init);</span><span style="color: #768390"> /* 设置ADC时钟 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* </span></span>
<span class="line"><span style="color: #768390"> 设置ADC1通道0~5对应的IO口模拟输入</span></span>
<span class="line"><span style="color: #768390"> AD采集引脚模式设置,模拟输入</span></span>
<span class="line"><span style="color: #768390"> PA0对应 ADC1_IN0</span></span>
<span class="line"><span style="color: #768390"> PA1对应 ADC1_IN1</span></span>
<span class="line"><span style="color: #768390"> PA2对应 ADC1_IN2</span></span>
<span class="line"><span style="color: #768390"> PA3对应 ADC1_IN3</span></span>
<span class="line"><span style="color: #768390"> PA4对应 ADC1_IN4</span></span>
<span class="line"><span style="color: #768390"> PA5对应 ADC1_IN5</span></span>
<span class="line"><span style="color: #768390"> */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Pin </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_PIN_0</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_1</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_2</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_3</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_4</span><span style="color: #F47067">|</span><span style="color: #ADBAC7">GPIO_PIN_5;</span><span style="color: #768390"> /* GPIOA0~5 */</span></span>
<span class="line"><span style="color: #ADBAC7"> gpio_init_struct.Mode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> GPIO_MODE_ANALOG;</span><span style="color: #768390"> /* 模拟 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_GPIO_Init</span><span style="color: #ADBAC7">(GPIOA, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">gpio_init_struct);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 初始化ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Instance </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC2;</span><span style="color: #768390"> /* 选择哪个ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.DataAlign </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_DATAALIGN_RIGHT;</span><span style="color: #768390"> /* 数据对齐方式:右对齐 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ScanConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SCAN_DISABLE;</span><span style="color: #768390"> /* 使能扫描模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ContinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ENABLE;</span><span style="color: #768390"> /* 使能连续转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.NbrOfConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 赋值范围是1~16,本实验用到6个规则通道序列 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.DiscontinuousConvMode </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> DISABLE;</span><span style="color: #768390"> /* 禁止规则通道组间断模式 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.NbrOfDiscConversion </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span><span style="color: #768390"> /* 配置间断模式的规则通道个数,禁止规则通道组间断模式后,此参数忽略 */</span></span>
<span class="line"><span style="color: #ADBAC7"> g_adc2_handle.Init.ExternalTrigConv </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SOFTWARE_START;</span><span style="color: #768390"> /* 软件触发 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Init</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 初始化 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADCEx_Calibration_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 校准ADC */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_2;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_1;</span><span style="color: #768390"> /* 采样序列里的第1个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.SamplingTime </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_SAMPLETIME_239CYCLES_5;</span><span style="color: #768390"> /* 采样时间,设置最大采样周期:239.5个ADC周期 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 通道配置 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_3;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_2;</span><span style="color: #768390"> /* 采样序列里的第2个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_4;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_3;</span><span style="color: #768390"> /* 采样序列里的第3个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Channel </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_CHANNEL_5;</span><span style="color: #768390"> /* 配置使用的ADC通道 */</span></span>
<span class="line"><span style="color: #ADBAC7"> adc_ch_conf.Rank </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> ADC_REGULAR_RANK_4;</span><span style="color: #768390"> /* 采样序列里的第4个 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConfigChannel</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">adc_ch_conf);</span><span style="color: #768390"> /* 配置ADC通道 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> //开启转换并触发中断</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_SetPriority</span><span style="color: #ADBAC7">(ADC1_2_IRQn, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">, </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> // 设置中断优先级</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_NVIC_EnableIRQ</span><span style="color: #ADBAC7">(ADC1_2_IRQn);</span><span style="color: #768390"> // 使能 ADC1 和 ADC2 的中断</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_ConvCpltCallback</span><span style="color: #ADBAC7">(ADC_HandleTypeDef</span><span style="color: #F47067">*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">hadc</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #768390">// static uint8_t ADC2CH=0;</span></span>
<span class="line"><span style="color: #768390">// if (hadc-&gt;Instance == ADC2)</span></span>
<span class="line"><span style="color: #768390">// {</span></span>
<span class="line"><span style="color: #768390">// </span></span>
<span class="line"><span style="color: #768390">// g_adc_dma_buf&#91;ADC2CH++&#93; = HAL_ADC_GetValue(hadc);</span></span>
<span class="line"><span style="color: #768390">// if(ADC2CH==4)ADC2CH=0;</span></span>
<span class="line"><span style="color: #768390">// </span></span>
<span class="line"><span style="color: #768390">// }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC1_2_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">__HAL_ADC_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, ADC_FLAG_EOC) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> // 将 gdc2 的地址传递给 HAL_ADC_IRQHandler</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">// 检查 ADC2 是否触发了中断</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7"> (</span><span style="color: #DCBDFB">__HAL_ADC_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc1_handle, ADC_FLAG_EOC) </span><span style="color: #F47067">!=</span><span style="color: #ADBAC7"> RESET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_IRQHandler</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc1_handle);</span><span style="color: #768390"> // 将 adc1 的地址传递给 HAL_ADC_IRQHandler</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ADC2_get_result</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ch</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_channel_set</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle , ch, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);</span><span style="color: #768390"> /* 设置通道,序列和采样时间 */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_Start</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 开启ADC */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_ADC_PollForConversion</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle, </span><span style="color: #6CB6FF">10</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> /* 轮询转换 */</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> (</span><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7">)</span><span style="color: #DCBDFB">HAL_ADC_GetValue</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_adc2_handle);</span><span style="color: #768390"> /* 返回最近一次ADC1规则组的转换结果 */</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:paragraph -->
<p>用法:在合适的位置定义变量 angle,然后初始化。</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"int16_t angle;\nadc_dma_init((uint32_t)\u0026ang);\nadc_dma_enable(1); //启动一次ADC转换\nOLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,ang);//打印出来","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e angle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eang\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //启动一次ADC转换\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,ang);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//打印出来\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":4,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>int16_t angle;
adc_dma_init((uint32_t)&amp;ang);
adc_dma_enable(1); //启动一次ADC转换
OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",ang);//打印出来</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> angle;</span></span>
<span class="line"><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #F69D50">ang</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span><span style="color: #768390"> //启动一次ADC转换</span></span>
<span class="line"><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,ang);</span><span style="color: #768390">//打印出来</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,168,0.45) 0%,rgba(155,81,224,0.55) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,168,0.45) 0%,rgba(155,81,224,0.55) 100%)"><!-- wp:paragraph -->
<p>理想状态下摆锤竖直时 ADC 读数是 2048;但我实测我的读数是 2010±10,因此以实际为准。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="Yhizs">PID 控制框图</h3>
<!-- /wp:heading -->

<!-- wp:image {"id":1047,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="http://www.wenzhimo.xyz/wp-content/uploads/2025/06/PID39-1024x235.webp" alt="" class="wp-image-1047"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解释:</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol class="wp-block-list"><!-- wp:list-item -->
<li>角度环接收目标角度,根据实际角度于目标角度的差调控电机以维持摆锤维持在正确角度上;</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>位置环接收位置,并通过动态改变角度环目标值来间接控制电机旋转。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>因此内环角度环的目标有两部分构成:一个是中心角度,用于保持摆锤稳定;另一个是位置环的输出值,用于调控横杆的位置。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="UgTGl">第一步:初始化外设&amp;搭建基本框架</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在程序开始前将所有外设初始化好,以免要用到时忘记初始化;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>除此之外,定时器中断、按键检测框架也要写好:</p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022PID.h\u0022\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n Timer_Init();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n key_v+=204;\n break;\n case 2:\n key_v-=204;\n break;\n case 3:\n key_v=0;\n break;\n case 4:\n key_v=-key_v;\n break;\n }\n\n// my_USART_printf(1,\u0022%.0f,%.0f,%.0fn\u0022,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\n\n //OLED_Update();\n\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n static int8_t count=0;\n count++;\n if(count%20==0){\n OLED_Update();\n }\n if(count==40){\n count=0;\n }\n\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e204\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003ekey_v;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// my_USART_printf(1,\u0026quot;%.0f,%.0f,%.0fn\u0026quot;,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":93,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "PID.h"

//当前电机速度和位置
int16_t speed=0,location=0;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

Timer_Init();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);

while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
key_v+=204;
break;
case 2:
key_v-=204;
break;
case 3:
key_v=0;
break;
case 4:
key_v=-key_v;
break;
}

// my_USART_printf(1,"%.0f,%.0f,%.0fn",LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);

//OLED_Update();

delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
static int8_t count=0;
count++;
if(count%20==0){
OLED_Update();
}
if(count==40){
count=0;
}

__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">204</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">=-</span><span style="color: #ADBAC7">key_v;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// my_USART_printf(1,&quot;%.0f,%.0f,%.0fn&quot;,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">int8_t</span><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">%</span><span style="color: #6CB6FF">20</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:paragraph -->
<p>并且,出于安全考虑,我们最先完成的是倒立摆的启停控制:需要我们手动通过按键来控制启停,并实现当程序判断倒立摆失败后自动停止。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>因此我们定义一个变量 RunState,并规定其为 0 时表示系统停止,为 1 时表示倒立摆工作。</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"uint8_t RunState;","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState;\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":1,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uint8_t RunState;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> RunState;</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>并通过按键一控制:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"switch(Key_GetNum()){\n case 1:\n RunState = !RunState ;\n break;\n case 2:\n break;\n case 3:\n break;\n case 4:\n break;\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState ;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":11,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>switch(Key_GetNum()){
case 1:
RunState = !RunState ;
break;
case 2:
break;
case 3:
break;
case 4:
break;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState ;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>下面就是在真正执行调控的函数里进行判断是否执行程序:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"void TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n if(RunState){\n //调控过程。。。\n }else{\n Motor_SetPWM(0);\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//调控过程。。。\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":15,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
if(RunState){
//调控过程。。。
}else{
Motor_SetPWM(0);
}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//调控过程。。。</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>接下来我们还要判断摆杆是不是倒了,来实现倒立摆失败时自动停止;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>因此我们要读取角度传感器的值,并在中断里读取它:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"uint16_t Angle;//在main函数之上定义全局变量\nadc_dma_init((uint32_t)\u0026Angle);//在中断里使能一次ADC转换,并通过DMA读取","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Angle;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//在main函数之上定义全局变量\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003eAngle\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//在中断里使能一次ADC转换,并通过DMA读取\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":2,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uint16_t Angle;//在main函数之上定义全局变量
adc_dma_init((uint32_t)&amp;Angle);//在中断里使能一次ADC转换,并通过DMA读取</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> Angle;</span><span style="color: #768390">//在main函数之上定义全局变量</span></span>
<span class="line"><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #F69D50">Angle</span><span style="color: #ADBAC7">);</span><span style="color: #768390">//在中断里使能一次ADC转换,并通过DMA读取</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>然后判断摆杆是不是在中心角度附近,我们用宏定义的方法来定义中心角度:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"#define CENTER_ANGLE 2010 //理想情况下是2048,根据实际调整\n#define CENTER_RANGE 500 //定义当角度处于什么范围内时我们认为是可调控的,500的意思是2010±500","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_ANGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2010\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //理想情况下是2048,根据实际调整\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_RANGE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e500\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //定义当角度处于什么范围内时我们认为是可调控的,500的意思是2010±500\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":2,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#define CENTER_ANGLE 2010 //理想情况下是2048,根据实际调整
#define CENTER_RANGE 500 //定义当角度处于什么范围内时我们认为是可调控的,500的意思是2010±500</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_ANGLE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2010</span><span style="color: #768390"> //理想情况下是2048,根据实际调整</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_RANGE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">500</span><span style="color: #768390"> //定义当角度处于什么范围内时我们认为是可调控的,500的意思是2010±500</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>然后判断:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"if(abs(Angle-CENTER_ANGLE) \u003e CENTER_RANGE){\n RunState=0;\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Angle\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eCENTER_ANGLE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CENTER_RANGE){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":3,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if(abs(Angle-CENTER_ANGLE) > CENTER_RANGE){
RunState=0;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">abs</span><span style="color: #ADBAC7">(Angle</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">CENTER_ANGLE) </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> CENTER_RANGE){</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>最后,在主函数里用 LED 灯指示运行状态并在 OLED 上输出即可:</p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,Angle);\nLED0(!RunState);","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState);\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":2,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",Angle);
LED0(!RunState);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Angle);</span></span>
<span class="line"><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState);</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>完整 main.c 如下:</p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>展开</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022PID.h\u0022\n\n#define CENTER_ANGLE 2010\n#define CENTER_RANGE 500\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\n\nuint16_t Angle;\nuint8_t RunState;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n int key_v = 0;\n\n Motor_SetPWM(0);\n\n adc_dma_init((uint32_t)\u0026Angle);\n\n Timer_Init();\n /*初始化PID结构体*/\n\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n RunState = !RunState ;\n break;\n case 2:\n break;\n case 3:\n break;\n case 4:\n break;\n }\n\n// my_USART_printf(1,\u0022%.0f,%.0f,%.0fn\u0022,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\n\n OLED_Printf(0,0,OLED_6X8,\u0022ADC:%-4d\u0022,Angle);\n OLED_Reverse();\n\n LED0(!RunState);\n OLED_Update();\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n adc_dma_enable(1);//读取角度传感器值\n if(abs(Angle-CENTER_ANGLE) \u003e CENTER_RANGE){\n RunState=0;\n }\n if(RunState){\n\n }else{\n Motor_SetPWM(0);\n }\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_ANGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2010\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_RANGE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e500\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Angle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*初始化PID结构体*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState ;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e// my_USART_printf(1,\u0026quot;%.0f,%.0f,%.0fn\u0026quot;,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;ADC:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-4d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//读取角度传感器值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Angle\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eCENTER_ANGLE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CENTER_RANGE){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":103,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "PID.h"

#define CENTER_ANGLE 2010
#define CENTER_RANGE 500

//当前电机速度和位置
int16_t speed=0,location=0;

uint16_t Angle;
uint8_t RunState;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

RP_Init();

Motor_Init();

Encoder_Init();

int key_v = 0;

Motor_SetPWM(0);

adc_dma_init((uint32_t)&amp;Angle);

Timer_Init();
/*初始化PID结构体*/

while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
RunState = !RunState ;
break;
case 2:
break;
case 3:
break;
case 4:
break;
}

// my_USART_printf(1,"%.0f,%.0f,%.0fn",LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);

OLED_Printf(0,0,OLED_6X8,"ADC:%-4d",Angle);
OLED_Reverse();

LED0(!RunState);
OLED_Update();
delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
adc_dma_enable(1);//读取角度传感器值
if(abs(Angle-CENTER_ANGLE) > CENTER_RANGE){
RunState=0;
}
if(RunState){

}else{
Motor_SetPWM(0);
}
__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_ANGLE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2010</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_RANGE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">500</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> Angle;</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> RunState;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">Angle);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #768390"> /*初始化PID结构体*/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState ;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">// my_USART_printf(1,&quot;%.0f,%.0f,%.0fn&quot;,LocationLoop.Target,LocationLoop.Actual_n,LocationLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;ADC:</span><span style="color: #F47067">%-4d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span><span style="color: #768390">//读取角度传感器值</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">abs</span><span style="color: #ADBAC7">(Angle</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">CENTER_ANGLE) </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> CENTER_RANGE){</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,135,0.5) 0%,rgba(155,81,224,0.53) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,135,0.5) 0%,rgba(155,81,224,0.53) 100%)"><!-- wp:paragraph -->
<p>我在这里遇到了定时器 1 初始化失败的情况。经过排查发现是 初始化顺序 导致的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>应当把 timer 放在最后一个初始化。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="sfW4g">第二步:确定内环调控周期&amp;调试内环 PID 参数</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>首先要确定调控周期,原则是:<font style="color:#FFFFFF;background-color:#A58F04;">在硬件参数允许的情况下,结合实际情况,调控越快越好</font>。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我们可以先从 40ms 开始测试,发现倒立摆始终摆不起来,就把周期设置为 20ms,发现还不行,……最后确定周期为 5ms 较好。<del>哈哈哈倒立摆摆不起来我就可以开摆了</del></p>
<!-- /wp:paragraph -->

<!-- wp:kevinbatdorf/code-block-pro {"code":"if(RunState){\n count1++;\n if(count1\u003e=5){\n count1=0;\n PID_UpdateActual(\u0026AngleLoop,Angle);\n PID_UpdateOut(\u0026AngleLoop);\n Motor_SetPWM(AngleLoop.Out);\n }\n}else{\n\n Motor_SetPWM(0);\n}","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(AngleLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":12,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if(RunState){
count1++;
if(count1>=5){
count1=0;
PID_UpdateActual(&amp;AngleLoop,Angle);
PID_UpdateOut(&amp;AngleLoop);
Motor_SetPWM(AngleLoop.Out);
}
}else{

Motor_SetPWM(0);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count1</span><span style="color: #F47067">&gt;=</span><span style="color: #6CB6FF">5</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(AngleLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph -->
<p>然后是创建 PID 结构体变量,开始调参:</p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022PID.h\u0022\n\n#define CENTER_ANGLE 2030\n#define CENTER_RANGE 500\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\n\nPID_t AngleLoop,LocationLoop;\n\nuint16_t Angle;\nuint8_t RunState = 0;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n adc_dma_init((uint32_t)\u0026Angle);\n adc_dma_enable(1);\n\n Timer_Init();\n\n /*初始化PID结构体*/\n PID_InitStruct(\u0026AngleLoop);\n PID_SetTarget(\u0026AngleLoop,CENTER_ANGLE);\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_II); //积分限幅\n //AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_ID); //不完全微分\n //AngleLoop.ID_A = 0.5;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_IS); //积分分离\n //AngleLoop.IS_A = 50;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_DL); //微分先行\n AngleLoop.Kp = 2.35,AngleLoop.Ki = 0.03,AngleLoop.Kd = 1.15;\n AngleLoop.Out_max = 1000;AngleLoop.Out_min = -1000;\n\n int key_v = 0;\n float* pid[3] = {\u0026AngleLoop.Kp,\u0026AngleLoop.Ki,\u0026AngleLoop.Kd};\n\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n RunState=!RunState;\n AngleLoop.Out =0;\n AngleLoop.ErrorInt=0;\n break;\n case 2:\n *pid[key_v]+=0.05f;\n break;\n case 3:\n *pid[key_v]-=0.05f;\n break;\n case 4:\n key_v++;\n if(key_v==3)key_v=0;\n break;\n }\n\n //AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;\n //AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;\n //AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;\n //AngleLoop.II_MAX = AngleLoop.Out_max/AngleLoop.Ki;\n //AngleLoop.II_MIN = AngleLoop.Out_min/AngleLoop.Ki;\n\n //Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);\n my_USART_printf(1,\u0022%d,%d,%dn\u0022,(int)AngleLoop.Target,Angle,(int)AngleLoop.Out);\n\n //OLED_Update();\n //adc_dma_enable(1);\n OLED_Printf(0,0,OLED_6X8,\u0022P:%-3.2f\u0022,AngleLoop.Kp);\n OLED_Printf(0,8,OLED_6X8,\u0022I:%-3.2f\u0022,AngleLoop.Ki);\n OLED_Printf(0,16,OLED_6X8,\u0022D:%-3.2f\u0022,AngleLoop.Kd);\n OLED_Printf(0,24,OLED_6X8,\u0022tar:%d\u0022,(int)AngleLoop.Target);\n OLED_Printf(0,32,OLED_6X8,\u0022act:%d\u0022,Angle);\n OLED_Printf(0,40,OLED_6X8,\u0022out:%d\u0022,(int)AngleLoop.Out);\n OLED_Reverse();\n OLED_ReverseArea(0,key_v*8,6,8);\n OLED_Update();\n LED0(!RunState);\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n adc_dma_enable(1);//读取角度传感器值\n if(abs(Angle-CENTER_ANGLE) \u003e CENTER_RANGE){\n RunState=0;\n AngleLoop.Out =0;\n AngleLoop.ErrorInt=0;\n }\n\n static uint8_t count1 = 1;\n\n if(1){\n if(RunState){\n count1++;\n if(count1\u003e=2){\n count1=0;\n PID_UpdateActual(\u0026AngleLoop,Angle);\n PID_UpdateOut(\u0026AngleLoop);\n Motor_SetPWM(AngleLoop.Out);\n }\n }else{\n\n Motor_SetPWM(0);\n }\n }\n\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_ANGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2030\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_RANGE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e500\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop,LocationLoop;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Angle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*初始化PID结构体*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,CENTER_ANGLE);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_II); //积分限幅\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_ID); //不完全微分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.ID_A = 0.5;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_IS); //积分分离\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.IS_A = 50;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_DL); //微分先行\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2.35\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.03\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1.15\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out_max \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;AngleLoop.Out_min \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#93; \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Kp,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Ki,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Kd};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;key_v\u0026#93;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.05\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;key_v\u0026#93;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.05\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.II_MAX = AngleLoop.Out_max/AngleLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.II_MIN = AngleLoop.Out_min/AngleLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Target,Angle,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//adc_dma_enable(1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;tar:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;act:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;out:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_ReverseArea\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e6\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//读取角度传感器值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Angle\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eCENTER_ANGLE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CENTER_RANGE){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(AngleLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":152,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "PID.h"

#define CENTER_ANGLE 2030
#define CENTER_RANGE 500

//当前电机速度和位置
int16_t speed=0,location=0;

PID_t AngleLoop,LocationLoop;

uint16_t Angle;
uint8_t RunState = 0;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

RP_Init();

Motor_Init();

Encoder_Init();

adc_dma_init((uint32_t)&amp;Angle);
adc_dma_enable(1);

Timer_Init();

/*初始化PID结构体*/
PID_InitStruct(&amp;AngleLoop);
PID_SetTarget(&amp;AngleLoop,CENTER_ANGLE);
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_II); //积分限幅
//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_ID); //不完全微分
//AngleLoop.ID_A = 0.5;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_IS); //积分分离
//AngleLoop.IS_A = 50;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_DL); //微分先行
AngleLoop.Kp = 2.35,AngleLoop.Ki = 0.03,AngleLoop.Kd = 1.15;
AngleLoop.Out_max = 1000;AngleLoop.Out_min = -1000;

int key_v = 0;
float* pid&#91;3&#93; = {&amp;AngleLoop.Kp,&amp;AngleLoop.Ki,&amp;AngleLoop.Kd};

while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
RunState=!RunState;
AngleLoop.Out =0;
AngleLoop.ErrorInt=0;
break;
case 2:
*pid&#91;key_v&#93;+=0.05f;
break;
case 3:
*pid&#91;key_v&#93;-=0.05f;
break;
case 4:
key_v++;
if(key_v==3)key_v=0;
break;
}

//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;
//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;
//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;
//AngleLoop.II_MAX = AngleLoop.Out_max/AngleLoop.Ki;
//AngleLoop.II_MIN = AngleLoop.Out_min/AngleLoop.Ki;

//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);
my_USART_printf(1,"%d,%d,%dn",(int)AngleLoop.Target,Angle,(int)AngleLoop.Out);

//OLED_Update();
//adc_dma_enable(1);
OLED_Printf(0,0,OLED_6X8,"P:%-3.2f",AngleLoop.Kp);
OLED_Printf(0,8,OLED_6X8,"I:%-3.2f",AngleLoop.Ki);
OLED_Printf(0,16,OLED_6X8,"D:%-3.2f",AngleLoop.Kd);
OLED_Printf(0,24,OLED_6X8,"tar:%d",(int)AngleLoop.Target);
OLED_Printf(0,32,OLED_6X8,"act:%d",Angle);
OLED_Printf(0,40,OLED_6X8,"out:%d",(int)AngleLoop.Out);
OLED_Reverse();
OLED_ReverseArea(0,key_v*8,6,8);
OLED_Update();
LED0(!RunState);
delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
adc_dma_enable(1);//读取角度传感器值
if(abs(Angle-CENTER_ANGLE) > CENTER_RANGE){
RunState=0;
AngleLoop.Out =0;
AngleLoop.ErrorInt=0;
}

static uint8_t count1 = 1;

if(1){
if(RunState){
count1++;
if(count1>=2){
count1=0;
PID_UpdateActual(&amp;AngleLoop,Angle);
PID_UpdateOut(&amp;AngleLoop);
Motor_SetPWM(AngleLoop.Out);
}
}else{

Motor_SetPWM(0);
}
}

__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_ANGLE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2030</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_RANGE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">500</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6CB6FF">PID_t</span><span style="color: #ADBAC7"> AngleLoop,LocationLoop;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> Angle;</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> RunState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*初始化PID结构体*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,CENTER_ANGLE);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_II); //积分限幅</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_ID); //不完全微分</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.ID_A = 0.5;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_IS); //积分分离</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.IS_A = 50;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_DL); //微分先行</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2.35</span><span style="color: #ADBAC7">,AngleLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.03</span><span style="color: #ADBAC7">,AngleLoop.Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1.15</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out_max </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;AngleLoop.Out_min </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">&#93; </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Kp,</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Ki,</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Kd};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=!</span><span style="color: #ADBAC7">RunState;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;key_v&#93;</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">0.05</span><span style="color: #F47067">f</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;key_v&#93;</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">0.05</span><span style="color: #F47067">f</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(key_v</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.II_MAX = AngleLoop.Out_max/AngleLoop.Ki;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.II_MIN = AngleLoop.Out_min/AngleLoop.Ki;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Target,Angle,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//adc_dma_enable(1);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Kd);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;tar:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;act:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;out:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_ReverseArea</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,key_v</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">6</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span><span style="color: #768390">//读取角度传感器值</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">abs</span><span style="color: #ADBAC7">(Angle</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">CENTER_ANGLE) </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> CENTER_RANGE){</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> count1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count1</span><span style="color: #F47067">&gt;=</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(AngleLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","backgroundColor":"contrast-2"} -->
<blockquote class="wp-block-quote is-style-plain has-contrast-2-background-color has-background"><!-- wp:paragraph -->
<p>你可能注意到代码中注释掉了大量的改进措施参数。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这是因为最开始我对调参的效果不满意,思来想去觉得可能是算法的问题,于是添加了改进效果进去;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><font style="color:#FFFFFF;background-color:#A58F04;">但这是错误的,改进算法应当放在最后一步进行,永远不要在参数调好之前乱加改进。</font></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><font style="background-color:rgba(255, 255, 255, 0);">后来发现效果怎么都不好,倒立摆常常处于一个“假稳定”的状态中,用手轻轻碰一下就转起来了;</font></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><font style="background-color:rgba(255, 255, 255, 0);">经过群友的点拨才把这些乱七八糟的步骤给去掉,从头开始重新调参。</font></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我调参的步骤:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>先调 P 项,从 0 一点一点往上加(为了不受电位器读取噪声我使用按键来进行调参)(注意此时其它两项都是 0),直到倒立摆可以较长时间维持“倒立”的状态(此时可能会有很大的抖动、横臂旋转等现象,没关系)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>然后调 D 项消抖,和 P 一样。如果你反复都调不好,可以重新再调一边 P,让 P 换个值再调 D。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最后是 I 项,一定一定注意!这里的 I 是为了抵消 P 再误差较小的时候输出力不足造成的误差(<a href="#u46d6d769">见上文</a>),因此 I 项一定要非常非常小!我这里的 I 给到 0.03,因为我发现 0.05 会加大抖动,0.01 又会调控力不足造成转动。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当参数调的差不多的时候。你可能会注意到有时候横臂会微微旋转以维持倒立,这是正常的,只要旋转速度别太快就行。后面我们会加上一个位置环来控制位置。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading" id="mvMr9">第三步:确定外环调控周期&amp;调试外环参数</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>外环是位置环,相比上面的角度环来说参数要宽松不少,毕竟角度环可是能直接决定倒立摆能否成功倒立。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这里我们和<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-base-color">内环</mark>一样,不选择任何改进,只是用最基本的 PID 计算。</p>
<!-- /wp:paragraph -->

<!-- wp:details -->
<details class="wp-block-details"><summary>main.c</summary><!-- wp:kevinbatdorf/code-block-pro {"code":"//#include \u0022./stm32f1xx_it.h\u0022\n#include \u0022./SYSTEM/sys/sys.h\u0022\n#include \u0022./SYSTEM/usart/usart.h\u0022\n#include \u0022./SYSTEM/delay/delay.h\u0022\n#include \u0022./BSP/LED/led.h\u0022\n//#include \u0022./BSP/EXTI/exti.h\u0022\n#include \u0022./BSP/KEY/key.h\u0022\n#include \u0022./BSP/TIMER/gtim.h\u0022\n#include \u0022./BSP/TIMER/atim.h\u0022\n#include \u0022./BSP/OLED/OLED.h\u0022\n#include \u0022./BSP/ADC/adc.h\u0022\n#include \u0022string.h\u0022\n#include \u0022./BSP/Motor/Motor.h\u0022\n#include \u0022./BSP/Encoder/Encoder.h\u0022\n#include \u0022PID.h\u0022\n\n#define CENTER_ANGLE 2035\n#define CENTER_RANGE 500\n\n//当前电机速度和位置\nint16_t speed=0,location=0;\n\nPID_t AngleLoop,LocationLoop;\n\nuint16_t Angle;\nuint8_t RunState = 0;\n\nint main(void)\n{\n HAL_Init();\n sys_stm32_clock_init(RCC_PLL_MUL9);\n delay_init(72);\n\n usart_init(1,115200);\n\n led_init();\n\n key_init();\n\n OLED_Init();\n\n LED_ON();\n\n RP_Init();\n\n Motor_Init();\n\n Encoder_Init();\n\n adc_dma_init((uint32_t)\u0026Angle);\n adc_dma_enable(1);\n\n Timer_Init();\n\n /*初始化PID结构体*/\n PID_InitStruct(\u0026AngleLoop);\n PID_SetTarget(\u0026AngleLoop,CENTER_ANGLE);\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_II); //积分限幅\n //AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_ID); //不完全微分\n //AngleLoop.ID_A = 0.5;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_IS); //积分分离\n //AngleLoop.IS_A = 50;\n //PID_Enable_Opt(\u0026AngleLoop,PID_OPT_DL); //微分先行\n AngleLoop.Kp = 2.0,AngleLoop.Ki = 0.03,AngleLoop.Kd = 6.21;\n AngleLoop.Out_max = 1000;AngleLoop.Out_min = -1000;\n\n PID_InitStruct(\u0026LocationLoop);\n PID_SetTarget(\u0026LocationLoop,0);\n LocationLoop.Kp = 0.5,LocationLoop.Ki = 0,LocationLoop.Kd = 5.72;\n LocationLoop.Out_max = 70;LocationLoop.Out_min = -70;\n\n int key_v = 0;\n float* pid[3] = {\u0026AngleLoop.Kp,\u0026AngleLoop.Ki,\u0026AngleLoop.Kd};\n\n while (1)\n {\n OLED_Clear();\n //OLED_Update();\n switch(Key_GetNum()){\n case 1:\n RunState=!RunState;\n AngleLoop.Out =0;\n AngleLoop.ErrorInt=0;\n break;\n case 2:\n *pid[key_v]+=0.02f;\n break;\n case 3:\n *pid[key_v]-=0.02f;\n break;\n case 4:\n key_v++;\n if(key_v==3)key_v=0;\n break;\n }\n\n //AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;\n //AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;\n //AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;\n LocationLoop.II_MAX = LocationLoop.Out_max/LocationLoop.Ki;\n LocationLoop.II_MIN = LocationLoop.Out_min/LocationLoop.Ki;\n\n //Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);\n my_USART_printf(1,\u0022%d,%d,%dn\u0022,(int)LocationLoop.Target,location,(int)LocationLoop.Out);\n\n //OLED_Update();\n //adc_dma_enable(1);\n OLED_Printf(0,0,OLED_6X8,\u0022P:%-3.2f\u0022,AngleLoop.Kp);\n OLED_Printf(0,8,OLED_6X8,\u0022I:%-3.2f\u0022,AngleLoop.Ki);\n OLED_Printf(0,16,OLED_6X8,\u0022D:%-3.2f\u0022,AngleLoop.Kd);\n OLED_Printf(0,24,OLED_6X8,\u0022tar:%d\u0022,(int)AngleLoop.Target);\n OLED_Printf(0,32,OLED_6X8,\u0022act:%d\u0022,Angle);\n OLED_Printf(0,40,OLED_6X8,\u0022out:%d\u0022,(int)AngleLoop.Out);\n\n OLED_Printf(64,0,OLED_6X8,\u0022P:%-3.2f\u0022,LocationLoop.Kp);\n OLED_Printf(64,8,OLED_6X8,\u0022I:%-3.2f\u0022,LocationLoop.Ki);\n OLED_Printf(64,16,OLED_6X8,\u0022D:%-3.2f\u0022,LocationLoop.Kd);\n OLED_Printf(64,24,OLED_6X8,\u0022tar:%d\u0022,(int)LocationLoop.Target);\n OLED_Printf(64,32,OLED_6X8,\u0022act:%d\u0022,location);\n OLED_Printf(64,40,OLED_6X8,\u0022out:%d\u0022,(int)LocationLoop.Out);\n OLED_Reverse();\n OLED_ReverseArea(64,key_v*8,8,8);\n OLED_Update();\n LED0(!RunState);\n delay_ms(20);\n }\n\n}\n\nvoid TIM1_UP_IRQHandler()\n{\n\n if(__HAL_TIM_GET_FLAG(\u0026g_tim1_handle, TIM_FLAG_UPDATE) == SET)\n {\n Key_Tick();\n adc_dma_enable(1);//读取角度传感器值\n\n speed = Encoder_Get();\n location+=speed; //获取电机的速度和位置\n\n if(abs(Angle-CENTER_ANGLE) \u003e CENTER_RANGE){ //如果误差太大则自动退出调控\n RunState=0;\n AngleLoop.Out =0;\n AngleLoop.ErrorInt=0;\n\n PID_SetTarget(\u0026AngleLoop,CENTER_ANGLE);\n LocationLoop.Out=0;\n LocationLoop.ErrorInt=0;\n location=0;\n }\n\n static uint8_t count1 = 0,count2 = 0;\n\n if(RunState){ //如果当前处于调控状态\n count1++;\n if(count1\u003e=2){\n count1=0;\n PID_UpdateActual(\u0026AngleLoop,Angle); //更新实际值\n PID_UpdateOut(\u0026AngleLoop); //计算输出\n Motor_SetPWM(AngleLoop.Out); //调控\n }\n }else{\n\n Motor_SetPWM(0);\n }\n\n if(RunState){\n count2++;\n if(count2\u003e=20){\n\n count2=0;\n PID_UpdateActual(\u0026LocationLoop,location);\n PID_UpdateOut(\u0026LocationLoop);\n\n PID_SetTarget(\u0026AngleLoop,CENTER_ANGLE - LocationLoop.Out); //调控\n }\n }else{\n\n }\n\n __HAL_TIM_CLEAR_IT(\u0026g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */\n }\n}\n","codeHTML":"\u003cpre class=\u0022shiki github-dark-dimmed\u0022 style=\u0022background-color: #22272e\u0022 tabindex=\u00220\u0022\u003e\u003ccode\u003e\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./stm32f1xx_it.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/sys/sys.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/usart/usart.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./SYSTEM/delay/delay.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/LED/led.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//#include \u0026quot;./BSP/EXTI/exti.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/KEY/key.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/gtim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/TIMER/atim.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/OLED/OLED.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/ADC/adc.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;string.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Motor/Motor.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;./BSP/Encoder/Encoder.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#include\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;PID.h\u0026quot;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_ANGLE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2035\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e#define\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eCENTER_RANGE\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e500\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//当前电机速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003ePID_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop,LocationLoop;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint16_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e Angle;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emain\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eHAL_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003esys_stm32_clock_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RCC_PLL_MUL9);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eusart_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e115200\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eled_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ekey_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED_ON\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eRP_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e((\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint32_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTimer_Init\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /*初始化PID结构体*/\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,CENTER_ANGLE);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_II); //积分限幅\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_ID); //不完全微分\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.ID_A = 0.5;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_IS); //积分分离\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.IS_A = 50;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//PID_Enable_Opt(\u0026amp;AngleLoop,PID_OPT_DL); //微分先行\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2.0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.03\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e6.21\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out_max \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;AngleLoop.Out_min \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1000\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_InitStruct\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Kp \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.5\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Ki \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kd \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e5.72\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_max \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e70\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;LocationLoop.Out_min \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e70\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003efloat*\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#93; \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Kp,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Ki,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop.Kd};\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ewhile\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e (\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Clear\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eswitch\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_GetNum\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;key_v\u0026#93;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.02\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #F69D50\u0022\u003epid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e\u0026#91;key_v\u0026#93;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0.02\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ef\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ecase\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e4\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e3\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003ebreak\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.II_MAX \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_max\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.II_MIN \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out_min\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e/\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop.Ki;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003emy_USART_printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003en\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)LocationLoop.Target,location,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//OLED_Update();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//adc_dma_enable(1);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,AngleLoop.Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;tar:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;act:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,Angle);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;out:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)AngleLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;P:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kp);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;I:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Ki);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e16\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;D:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%-3.2f\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,LocationLoop.Kd);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e24\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;tar:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)LocationLoop.Target);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e32\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;act:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,location);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Printf\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e40\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,OLED_6X8,\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;out:\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e%d\u003c/span\u003e\u003cspan style=\u0022color: #96D0FF\u0022\u003e\u0026quot;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eint\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e)LocationLoop.Out);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Reverse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_ReverseArea\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e64\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,key_v\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e*\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e8\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eOLED_Update\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eLED0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e!\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eRunState);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003edelay_ms\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #F47067\u0022\u003evoid\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eTIM1_UP_IRQHandler\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e()\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_GET_FLAG\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_FLAG_UPDATE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e==\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e SET)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eKey_Tick\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eadc_dma_enable\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e1\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e//读取角度传感器值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e speed \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eEncoder_Get\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e();\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e+=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003espeed;\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //获取电机的速度和位置\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eabs\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(Angle\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eCENTER_ANGLE) \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e CENTER_RANGE){\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //如果误差太大则自动退出调控\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e RunState\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.Out \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e AngleLoop.ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,CENTER_ANGLE);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.ErrorInt\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e location\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003estatic\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003euint8_t\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e,count2 \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //如果当前处于调控状态\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e2\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count1\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,Angle);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //更新实际值\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //计算输出\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(AngleLoop.Out);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //调控\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003eMotor_SetPWM\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(RunState){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e++\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eif\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(count2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026gt;=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e20\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e){\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e count2\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e=\u003c/span\u003e\u003cspan style=\u0022color: #6CB6FF\u0022\u003e0\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e;\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateActual\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop,location);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_UpdateOut\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eLocationLoop);\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003ePID_SetTarget\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eAngleLoop,CENTER_ANGLE \u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e-\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e LocationLoop.Out);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e //调控\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003eelse\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e \u003c/span\u003e\u003cspan style=\u0022color: #DCBDFB\u0022\u003e__HAL_TIM_CLEAR_IT\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e(\u003c/span\u003e\u003cspan style=\u0022color: #F47067\u0022\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003eg_tim1_handle, TIM_IT_UPDATE);\u003c/span\u003e\u003cspan style=\u0022color: #768390\u0022\u003e /* 清除定时器溢出中断标志位 */\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003cspan style=\u0022color: #ADBAC7\u0022\u003e}\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\u0022line\u0022\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e","language":"c","theme":"github-dark-dimmed","bgColor":"#22272e","textColor":"#adbac7","fontSize":".875rem","fontFamily":"Code-Pro-JetBrains-Mono","lineHeight":"1.25rem","clampFonts":false,"lineNumbers":true,"headerType":"simpleString","disablePadding":false,"footerType":"none","enableMaxHeight":false,"seeMoreType":"","seeMoreString":"","seeMoreAfterLine":"","seeMoreTransition":false,"seeMoreCollapse":false,"seeMoreCollapseString":"","highestLineNumber":185,"highlightingHover":false,"lineHighlightColor":"rgba(139, 186, 234, 0.2)","copyButton":true,"copyButtonType":"twoSquares","copyButtonUseTextarea":true,"useTabs":false} -->
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">C</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="复制" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>//#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
//#include "./BSP/EXTI/exti.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/gtim.h"
#include "./BSP/TIMER/atim.h"
#include "./BSP/OLED/OLED.h"
#include "./BSP/ADC/adc.h"
#include "string.h"
#include "./BSP/Motor/Motor.h"
#include "./BSP/Encoder/Encoder.h"
#include "PID.h"

#define CENTER_ANGLE 2035
#define CENTER_RANGE 500

//当前电机速度和位置
int16_t speed=0,location=0;

PID_t AngleLoop,LocationLoop;

uint16_t Angle;
uint8_t RunState = 0;

int main(void)
{
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);

usart_init(1,115200);

led_init();

key_init();

OLED_Init();

LED_ON();

RP_Init();

Motor_Init();

Encoder_Init();

adc_dma_init((uint32_t)&amp;Angle);
adc_dma_enable(1);

Timer_Init();

/*初始化PID结构体*/
PID_InitStruct(&amp;AngleLoop);
PID_SetTarget(&amp;AngleLoop,CENTER_ANGLE);
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_II); //积分限幅
//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_ID); //不完全微分
//AngleLoop.ID_A = 0.5;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_IS); //积分分离
//AngleLoop.IS_A = 50;
//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_DL); //微分先行
AngleLoop.Kp = 2.0,AngleLoop.Ki = 0.03,AngleLoop.Kd = 6.21;
AngleLoop.Out_max = 1000;AngleLoop.Out_min = -1000;

PID_InitStruct(&amp;LocationLoop);
PID_SetTarget(&amp;LocationLoop,0);
LocationLoop.Kp = 0.5,LocationLoop.Ki = 0,LocationLoop.Kd = 5.72;
LocationLoop.Out_max = 70;LocationLoop.Out_min = -70;

int key_v = 0;
float* pid&#91;3&#93; = {&amp;AngleLoop.Kp,&amp;AngleLoop.Ki,&amp;AngleLoop.Kd};

while (1)
{
OLED_Clear();
//OLED_Update();
switch(Key_GetNum()){
case 1:
RunState=!RunState;
AngleLoop.Out =0;
AngleLoop.ErrorInt=0;
break;
case 2:
*pid&#91;key_v&#93;+=0.02f;
break;
case 3:
*pid&#91;key_v&#93;-=0.02f;
break;
case 4:
key_v++;
if(key_v==3)key_v=0;
break;
}

//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;
//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;
//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;
LocationLoop.II_MAX = LocationLoop.Out_max/LocationLoop.Ki;
LocationLoop.II_MIN = LocationLoop.Out_min/LocationLoop.Ki;

//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);
my_USART_printf(1,"%d,%d,%dn",(int)LocationLoop.Target,location,(int)LocationLoop.Out);

//OLED_Update();
//adc_dma_enable(1);
OLED_Printf(0,0,OLED_6X8,"P:%-3.2f",AngleLoop.Kp);
OLED_Printf(0,8,OLED_6X8,"I:%-3.2f",AngleLoop.Ki);
OLED_Printf(0,16,OLED_6X8,"D:%-3.2f",AngleLoop.Kd);
OLED_Printf(0,24,OLED_6X8,"tar:%d",(int)AngleLoop.Target);
OLED_Printf(0,32,OLED_6X8,"act:%d",Angle);
OLED_Printf(0,40,OLED_6X8,"out:%d",(int)AngleLoop.Out);

OLED_Printf(64,0,OLED_6X8,"P:%-3.2f",LocationLoop.Kp);
OLED_Printf(64,8,OLED_6X8,"I:%-3.2f",LocationLoop.Ki);
OLED_Printf(64,16,OLED_6X8,"D:%-3.2f",LocationLoop.Kd);
OLED_Printf(64,24,OLED_6X8,"tar:%d",(int)LocationLoop.Target);
OLED_Printf(64,32,OLED_6X8,"act:%d",location);
OLED_Printf(64,40,OLED_6X8,"out:%d",(int)LocationLoop.Out);
OLED_Reverse();
OLED_ReverseArea(64,key_v*8,8,8);
OLED_Update();
LED0(!RunState);
delay_ms(20);
}

}

void TIM1_UP_IRQHandler()
{

if(__HAL_TIM_GET_FLAG(&amp;g_tim1_handle, TIM_FLAG_UPDATE) == SET)
{
Key_Tick();
adc_dma_enable(1);//读取角度传感器值

speed = Encoder_Get();
location+=speed; //获取电机的速度和位置

if(abs(Angle-CENTER_ANGLE) > CENTER_RANGE){ //如果误差太大则自动退出调控
RunState=0;
AngleLoop.Out =0;
AngleLoop.ErrorInt=0;

PID_SetTarget(&amp;AngleLoop,CENTER_ANGLE);
LocationLoop.Out=0;
LocationLoop.ErrorInt=0;
location=0;
}

static uint8_t count1 = 0,count2 = 0;

if(RunState){ //如果当前处于调控状态
count1++;
if(count1>=2){
count1=0;
PID_UpdateActual(&amp;AngleLoop,Angle); //更新实际值
PID_UpdateOut(&amp;AngleLoop); //计算输出
Motor_SetPWM(AngleLoop.Out); //调控
}
}else{

Motor_SetPWM(0);
}

if(RunState){
count2++;
if(count2>=20){

count2=0;
PID_UpdateActual(&amp;LocationLoop,location);
PID_UpdateOut(&amp;LocationLoop);

PID_SetTarget(&amp;AngleLoop,CENTER_ANGLE - LocationLoop.Out); //调控
}
}else{

}

__HAL_TIM_CLEAR_IT(&amp;g_tim1_handle, TIM_IT_UPDATE); /* 清除定时器溢出中断标志位 */
}
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390">//#include &quot;./stm32f1xx_it.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/sys/sys.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/usart/usart.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./SYSTEM/delay/delay.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/LED/led.h&quot;</span></span>
<span class="line"><span style="color: #768390">//#include &quot;./BSP/EXTI/exti.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/KEY/key.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/gtim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/TIMER/atim.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/OLED/OLED.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/ADC/adc.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;string.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Motor/Motor.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;./BSP/Encoder/Encoder.h&quot;</span></span>
<span class="line"><span style="color: #F47067">#include</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;PID.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_ANGLE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2035</span></span>
<span class="line"><span style="color: #F47067">#define</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">CENTER_RANGE</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">500</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390">//当前电机速度和位置</span></span>
<span class="line"><span style="color: #F47067">int16_t</span><span style="color: #ADBAC7"> speed</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6CB6FF">PID_t</span><span style="color: #ADBAC7"> AngleLoop,LocationLoop;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">uint16_t</span><span style="color: #ADBAC7"> Angle;</span></span>
<span class="line"><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> RunState </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">int</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">main</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">void</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">HAL_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">sys_stm32_clock_init</span><span style="color: #ADBAC7">(RCC_PLL_MUL9);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">72</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">usart_init</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">115200</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">led_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">key_init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED_ON</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">RP_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_init</span><span style="color: #ADBAC7">((</span><span style="color: #F47067">uint32_t</span><span style="color: #ADBAC7">)</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Timer_Init</span><span style="color: #ADBAC7">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"> /*初始化PID结构体*/</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,CENTER_ANGLE);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_II); //积分限幅</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.II_MAX = 5000;AngleLoop.II_MIN = -5000;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_ID); //不完全微分</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.ID_A = 0.5;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_IS); //积分分离</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.IS_A = 50;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//PID_Enable_Opt(&amp;AngleLoop,PID_OPT_DL); //微分先行</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2.0</span><span style="color: #ADBAC7">,AngleLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.03</span><span style="color: #ADBAC7">,AngleLoop.Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">6.21</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out_max </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;AngleLoop.Out_min </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">1000</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_InitStruct</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Kp </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0.5</span><span style="color: #ADBAC7">,LocationLoop.Ki </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,LocationLoop.Kd </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">5.72</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Out_max </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">70</span><span style="color: #ADBAC7">;LocationLoop.Out_min </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">-</span><span style="color: #6CB6FF">70</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">int</span><span style="color: #ADBAC7"> key_v </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">float*</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">&#93; </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> {</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Kp,</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Ki,</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop.Kd};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">while</span><span style="color: #ADBAC7"> (</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Clear</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">switch</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">Key_GetNum</span><span style="color: #ADBAC7">()){</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=!</span><span style="color: #ADBAC7">RunState;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;key_v&#93;</span><span style="color: #F47067">+=</span><span style="color: #6CB6FF">0.02</span><span style="color: #F47067">f</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">*</span><span style="color: #F69D50">pid</span><span style="color: #ADBAC7">&#91;key_v&#93;</span><span style="color: #F47067">-=</span><span style="color: #6CB6FF">0.02</span><span style="color: #F47067">f</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">case</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">4</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7"> key_v</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(key_v</span><span style="color: #F47067">==</span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7">)key_v</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">break</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Kp=RP_GetValue(1)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Ki=RP_GetValue(2)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//AngleLoop.Kd=RP_GetValue(3)/4095.0 *15;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.II_MAX </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> LocationLoop.Out_max</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">LocationLoop.Ki;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.II_MIN </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> LocationLoop.Out_min</span><span style="color: #F47067">/</span><span style="color: #ADBAC7">LocationLoop.Ki;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//Motor_SetPWM(RP_GetValue(4)/4095.0 *1000);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">my_USART_printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">,</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">n&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)LocationLoop.Target,location,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)LocationLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//OLED_Update();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #768390">//adc_dma_enable(1);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,AngleLoop.Kd);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;tar:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;act:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,Angle);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;out:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)AngleLoop.Out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;P:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Kp);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;I:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Ki);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">16</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;D:</span><span style="color: #F47067">%-3.2f</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,LocationLoop.Kd);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">24</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;tar:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)LocationLoop.Target);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">32</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;act:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,location);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Printf</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">40</span><span style="color: #ADBAC7">,OLED_6X8,</span><span style="color: #96D0FF">&quot;out:</span><span style="color: #F47067">%d</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,(</span><span style="color: #F47067">int</span><span style="color: #ADBAC7">)LocationLoop.Out);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Reverse</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_ReverseArea</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">64</span><span style="color: #ADBAC7">,key_v</span><span style="color: #F47067">*</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">,</span><span style="color: #6CB6FF">8</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">OLED_Update</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">LED0</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">!</span><span style="color: #ADBAC7">RunState);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">delay_ms</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">void</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">TIM1_UP_IRQHandler</span><span style="color: #ADBAC7">()</span></span>
<span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">__HAL_TIM_GET_FLAG</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_FLAG_UPDATE) </span><span style="color: #F47067">==</span><span style="color: #ADBAC7"> SET)</span></span>
<span class="line"><span style="color: #ADBAC7"> {</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Key_Tick</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">adc_dma_enable</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7">);</span><span style="color: #768390">//读取角度传感器值</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> speed </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Encoder_Get</span><span style="color: #ADBAC7">();</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">+=</span><span style="color: #ADBAC7">speed;</span><span style="color: #768390"> //获取电机的速度和位置</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(</span><span style="color: #DCBDFB">abs</span><span style="color: #ADBAC7">(Angle</span><span style="color: #F47067">-</span><span style="color: #ADBAC7">CENTER_ANGLE) </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> CENTER_RANGE){</span><span style="color: #768390"> //如果误差太大则自动退出调控</span></span>
<span class="line"><span style="color: #ADBAC7"> RunState</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.Out </span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> AngleLoop.ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,CENTER_ANGLE);</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.Out</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> LocationLoop.ErrorInt</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> location</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">static</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">uint8_t</span><span style="color: #ADBAC7"> count1 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">,count2 </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span><span style="color: #768390"> //如果当前处于调控状态</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count1</span><span style="color: #F47067">&gt;=</span><span style="color: #6CB6FF">2</span><span style="color: #ADBAC7">){</span></span>
<span class="line"><span style="color: #ADBAC7"> count1</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,Angle);</span><span style="color: #768390"> //更新实际值</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop);</span><span style="color: #768390"> //计算输出</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(AngleLoop.Out);</span><span style="color: #768390"> //调控</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">Motor_SetPWM</span><span style="color: #ADBAC7">(</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">);</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(RunState){</span></span>
<span class="line"><span style="color: #ADBAC7"> count2</span><span style="color: #F47067">++</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #F47067">if</span><span style="color: #ADBAC7">(count2</span><span style="color: #F47067">&gt;=</span><span style="color: #6CB6FF">20</span><span style="color: #ADBAC7">){</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> count2</span><span style="color: #F47067">=</span><span style="color: #6CB6FF">0</span><span style="color: #ADBAC7">;</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateActual</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop,location);</span></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_UpdateOut</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">LocationLoop);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">PID_SetTarget</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">AngleLoop,CENTER_ANGLE </span><span style="color: #F47067">-</span><span style="color: #ADBAC7"> LocationLoop.Out);</span><span style="color: #768390"> //调控</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span><span style="color: #F47067">else</span><span style="color: #ADBAC7">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">__HAL_TIM_CLEAR_IT</span><span style="color: #ADBAC7">(</span><span style="color: #F47067">&amp;</span><span style="color: #ADBAC7">g_tim1_handle, TIM_IT_UPDATE);</span><span style="color: #768390"> /* 清除定时器溢出中断标志位 */</span></span>
<span class="line"><span style="color: #ADBAC7"> }</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span>
<span class="line"></span></code></pre></div>
<!-- /wp:kevinbatdorf/code-block-pro -->

<!-- wp:paragraph {"placeholder":"键入 / 添加隐藏区块"} -->
<p></p>
<!-- /wp:paragraph --></details>
<!-- /wp:details -->

<!-- wp:quote {"className":"is-style-plain","style":{"color":{"gradient":"linear-gradient(135deg,rgba(7,227,168,0.5) 0%,rgba(155,81,224,0.54) 100%)"}}} -->
<blockquote class="wp-block-quote is-style-plain has-background" style="background:linear-gradient(135deg,rgba(7,227,168,0.5) 0%,rgba(155,81,224,0.54) 100%)"><!-- wp:paragraph -->
<p> 最后我的参数是:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>角度环(内环):P 2.0 I 0.03 D 6.21</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>位置环(外环):P 0.5 I 0 D 5.72</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>说实话这个参数效果只能算一般,不过我已经调累了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果你的横臂位置总是于目标有偏差,别着急加 I 项,先看看是不是中心角度设置的不对。如果你真要加,注意做好积分分离即可。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>到目前为止,我们的倒立摆已经可以说是完成了。如果你只是为了学习 PID,那下面“自动起摆”的部分可以忽略了(老实说我也不想写了,累死了,燃尽了啊啊啊)。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3,"className":"is-style-default"} -->
<h3 class="wp-block-heading is-style-default" id="nuIHF">第四步:添加自动起摆逻辑控制</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>前言:起摆不只有一种方法,全看各位喜好。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>哎,不想写了,回头再写吧。各位看官有缘再见。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1051,"sizeSlug":"full","linkDestination":"none","className":"is-style-default","style":{"color":{"duotone":"unset"},"spacing":{"margin":{"top":"0","bottom":"0"}},"border":{"radius":"39px"}}} -->
<figure class="wp-block-image size-full has-custom-border is-style-default" style="margin-top:0;margin-bottom:0"><img src="https://www.wenzhimo.xyz/wp-content/uploads/2025/06/twitter_駅長@zhanzhangzlw_20250205-165115_1887182211239305449_photo.jpg" alt="" class="wp-image-1051" style="border-radius:39px"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph {"fontSize":"xx-large"} -->
<p class="has-xx-large-font-size"><strong><mark style="background-color:rgba(0, 0, 0, 0);color:#7899cc" class="has-inline-color">⋰₰(OwO)₰⋱</mark></strong></p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<style>
/* 自定义样式 */
abbr {
font-weight: bold; /* 使缩写文本加粗 */
cursor: help; /* 鼠标悬停时显示帮助光标 */
position: relative; /* 设置相对定位 */
}

abbr::after {
content: attr(data-title); /* 显示 title 属性的内容 */
text-decoration: line-through; /* 添加删除线 */
color: #7899CC; /* 设置文本颜色为红色 */
position: absolute;
top: 100%; /* 位于元素上方 */
left: 0;
background-color: #2b2b2b; /* 背景颜色 */
border: 1px solid #ccc; /* 边框 */
padding: 2px 5px; /* 内边距 */
white-space: nowrap; /* 防止换行 */
display: none; /* 默认不显示 */
z-index: 100; /* 确保显示在上方 */
}

abbr:hover::after {
display: block; /* 鼠标悬停时显示 */
}
</style>
<!-- /wp:html -->

<!-- wp:html -->
<p class="has-xx-large-font-size" style="color:#7899CC"><abbr data-title="蓝色小章鱼" title="你知道的太多了"><strong>丰川祥子</strong></abbr><strong>祝你幸福 desuwa~</strong></p>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:footnotes /-->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

http://www.kefakeji.com/news/465.html

相关文章:

  • POLIR-Laws-民法典: 民法典 包括 并 废止 《合同法》
  • 18
  • 字节-大模型联邦精调方案
  • PID控制算法
  • 分块
  • 并查集
  • 7-27
  • CVE-2021-21311 服务器端请求伪造(SSRF)漏洞 (复现)
  • 【Rag实用分享】小白也能看懂的文档解析和分割教程
  • 【纯干货】三张图深入分析京东开源Genie的8大亮点
  • JoyAgent综合测评报告
  • 【EF Core】为 DatabaseFacade 扩展“创建”与“删除”数据表功能
  • 亚马逊机器学习大学推出负责任AI课程 - 聚焦AI偏见缓解与公平性实践
  • FFmpeg开发笔记(七十八)采用Kotlin+Compose的NextPlayer播放器
  • 4.5.4 预测下一个PC
  • 第十六日
  • 2025“钉耙编程”中国大学生算法设计暑期联赛(3)
  • VMware Windows Linux Macos网盘下载
  • ZBrush 2025 中文版免费下载,附图文安装指南,小白也能快速上手!
  • k8s network
  • hyprland初尝试
  • 正则表达式 更新常用则表达式-----loading
  • 幼儿园小班线段树
  • 树02
  • 深入ADC采样
  • 学习笔记:MySQL :eq_range_index_dive_limit参数
  • Python字符串知识点总结
  • SQL Server 2025年7月更新 - 修复 CVE-2025-49718 Microsoft SQL Server 信息泄露漏洞
  • 读书笔记:Oracle数据库内存结构:系统全局区(SGA)详解
  • 小飞标签