STM32用标准库函数的直流电机PID程序

2023-11-06

#include "stm32f10x.h"

// 定义电机控制引脚
#define MOTOR_PIN1 GPIO_Pin_0
#define MOTOR_PIN2 GPIO_Pin_1

// PID参数
float Kp = 1.0;
float Ki = 0.5;
float Kd = 0.2;

// 目标速度和当前速度
int targetSpeed = 1000;
int currentSpeed = 0;

// PID变量
float error = 0;
float previousError = 0;
float integral = 0;
float derivative = 0;

void GPIO_Configuration(void);
void TIM_Configuration(void);

int main(void)
{
    GPIO_Configuration();
    TIM_Configuration();

    while (1)
    {
        // 读取编码器计数值并计算当前速度
        int encoderCount = TIM_GetCounter(TIM2);
        currentSpeed = encoderCount * 10; // 假设每个计数对应10个脉冲

        // 计算PID控制量
        error = targetSpeed - currentSpeed;
        integral += error;
        derivative = error - previousError;

        float control = Kp * error + Ki * integral + Kd * derivative;

        // 限制控制量在PWM范围内
        if (control > TIM2->ARR)
            control = TIM2->ARR;
        else if (control < 0)
            control = 0;

        // 设置PWM输出占空比
        TIM_SetCompare1(TIM2, control);

        previousError = error;
    }
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置GPIOA引脚为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能TIM2时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 配置TIM2基本参数
    TIM_TimeBaseStructure.TIM_Period = 999; // PWM周期为1000个计数,对应1ms
    TIM_TimeBaseStructure.TIM_Prescaler = 71; // APB1时钟频率为72MHz,预分频系数为72-1,得到1MHz的计数频率
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    // 配置TIM2通道1为PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    // 使能TIM2预装载寄存器
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    // 使能TIM2
    TIM_Cmd(TIM2, ENABLE);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32用标准库函数的直流电机PID程序 的相关文章

  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • UmiJS介绍--mock(四)

    umi 里约定 mock 文件夹下的文件即 mock 文件 文件导出接口定义 支持基于 require 动态分析的实时刷新 支持 ES6 语法 以及友好的出错提示 1 引入 Mock js Mock js是常用的辅助生成模拟数据的第三方库
  • 编写过滤器jar包并植入到项目中

    公司有项目有个需求 就是希望可以写一个统一的权限管理 每次开发新项目的时候 可以通过添加依赖包进行权限的获取 验证 至于为什么不使用aop 拦截器二使用过滤器 是因为在java中 如果3者同事存在 最先执行的是过滤器 一 新建第三方过滤器j
  • QT 使用 qtasome图标 (python版)

    首先安装 qtawesome 库 然后到图标库找到需要的图标 图标名称为 fa xxx 图标库链接 http www fontawesome com cn faicons 在 retranslateUi 模块中 对相应 按钮 进行操作 运行
  • 6_机器翻译与Seq2Seq模型

    文章目录 一 Sequence to Sequence Model Seq2Seq 1 1 Machine Translation Data 机器翻译数据 1 2 Tokenization Build Dictionary 分词和建造字典
  • uva 1601 The Morning after Halloween code2

    题目 The Morning after Halloween 题意 有n个用小写字母表示的鬼和一张地图 每个鬼都要移动到对应的大写字母 两个鬼的位置不能在一次移动中交换 问最少步数 思路 双向bfs 此题还可以单向bfs 见code1 1
  • 0.面向对象的设计模式与原则

    面向对象的设计模式与原则 设计模式与面向对象 面向对象编程语言的三大机制 面向对象编程语言 OOPL 并非面向对象的全部 重新认识面向对象 从设计原则到设计模式 几条更具体的设计原则 1 单一职责原则 SRP 2 里式替换原则 LSP 3
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记16 The Dao

    这个是接着北京大学肖臻老师的课记的笔记 由于前面的笔记在 https blog csdn net Mu Xiaoye article details 104299664 已经有前人写好了 并且写的不错 所以这里直接给出链接 然后这个是剩下的
  • 通过主机名字获取与端口号获取对应的IP地址

    利用boost asio中的库函数获取本地主机的名字和通过主机名字获取与端口号获取对应的IP地址 源代码如下 Boost others network function cpp 此文件包含 main 函数 程序执行将在此处开始并结束 inc
  • C++ 默认析构函数

    1 与构造函数一样 假如我们不指定自己的析构函数 那么编译器将为我们创建一个默认析构函数 析构函数 Destructor 也是一种特殊的成员函数 没有返回值 不需要用户调用 而是在销毁对象时自动执行 与构造函数不同的是 析构函数的名字是在类
  • 自定义线程池—学习原理,设计思想,独立实现

    自定义线程池 0 概念与模型 主线程不断地生产任务 直接交付线程执行 当前线程池数量 lt 核心数 否则 加入阻塞任务队列 等到线程池中空闲的线程获取执行 否则 阻塞队列已满 开发接口 拒绝策略 等待 超时等待队列不满时加入队列 放弃任务
  • Docker带ce和不带ce的区别

    Docker带ce和不带ce的区别
  • 第十一届蓝桥杯 2020年国赛真题 (Java 大学A组)

    蓝桥杯 2020年国赛真题 Java 大学 A 组 A 合数个数 B 含 2 天数 归纳法 C 本质上升序列 动态规划 D 咫尺天涯 动态规划 E 玩具蛇 F 游园安排 最长单调子序列 G 画廊 动态规划 H 奇偶覆盖 扫描线 I 补给 J
  • VC++ 源码实现通达信公式管理器

    效果图 前段时间 因业务需要 写了这样一个软件 同样的页面已经是第2次写了 第1次大约5年前的事情了 因为代码遗失 于是重新写 页面看似复杂 实现起来非常简单 第一步 参照通达信的公式管理器核心文件TCalc dll 导出资源文件 TCal
  • 汇编语言中各种寄存器的总结

    汇编语言中各种寄存器的总结 1 通用寄存器 数据寄存器 AX BX CX DX 指针寄存器 SP BP 变址寄存器 SI DI 2 控制寄存器 IP FLAG 3 段寄存器 CS 代码段寄存器 基本概念解释 start作用 DS 数据段寄存
  • 有了sourcegraph这个工具我在github看代码效率提高10倍!

    微信搜 后端技术学堂 有干货 本文已收录于Github https github com imcoderlemon CodeClass 内含原创干货文章 千本计算机电子书 3本LeetCode题解 各类编程资源 程序员逛github已经是每
  • Ansible的脚本------playbook剧本(各位观众请就位,演出开始了)

    目录 一 剧本的前置知识点 1 主机清单 2 YAML 1 基本语法规则 2 YAML支持的数据结构 二 Ansible的脚本 playbook 1 playbooks的组成部分 2 执行playbook 3 hosts和users介绍 4
  • 性能测试时如何监控mysql数据库

    在进行MySQL性能测试时 监控数据库的状态和性能数据可以帮助我们了解系统的负载情况和性能瓶颈 下面是几种常用的MySQL性能监控方式 1 MySQL自带的性能监控工具 MySQL中自带了一些技术性能监控工具 如SHOW STATUS和SH
  • 前端代码走查模板

    文末有word版的资源下载链接 需要的小伙伴可以自行下载 前言 本次走查发现的内容如下 请优先修改项目报错问题 注 代码走查结果不作为强制要求 但是为了营造良性的开发氛围 希望大家能做出一定程度的改正 另 如有错误或不合理之处 请及时与代码
  • wps解决图片只显示一小条,不显示全图

    解决方法 在图片前面打开段落 设置行距为单倍行距即可
  • STM32用标准库函数的直流电机PID程序

    include stm32f10x h 定义电机控制引脚 define MOTOR PIN1 GPIO Pin 0 define MOTOR PIN2 GPIO Pin 1 PID参数 float Kp 1 0 float Ki 0 5 f