找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2462|回复: 13
收起左侧

使用chatGPT写单片机程序

  [复制链接]
ID:309610 发表于 2023-4-22 12:55 | 显示全部楼层 |阅读模式
赶一波AI的热潮,最近chat GPT超火,就体验了一下用AI自动生成代码,太强悍了也有不足的地方

我使用的是第三方接口的chat gpt 3.5。真是学习编程的神器。

51hei.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:309610 发表于 2023-4-22 13:03 | 显示全部楼层

51hei2.jpg
51hei1.jpg
回复

使用道具 举报

ID:309610 发表于 2023-4-22 20:22 来自手机 | 显示全部楼层
以下是一个结合了零点满度校正、多点线性校正、使用二阶低通巴特沃斯滤波器和温度模糊PID控制的51单片机程序

  1. #include <reg51.h>

  2. #define ADC_CS P1_0
  3. #define ADC_CLK P1_1
  4. #define ADC_DIN P1_2
  5. #define ADC_DOUT P1_3

  6. // 巴特沃斯滤波器参数
  7. float b0 = 0.0025; // b0系数
  8. float b1 = 0.005; // b1系数
  9. float b2 = 0.0025; // b2系数
  10. float a1 = -1.8227; // a1系数
  11. float a2 = 0.8316; // a2系数

  12. // 状态变量
  13. float x[2] = {0.0, 0.0}; // 巴特沃斯滤波器输入状态变量
  14. float y[2] = {0.0, 0.0}; // 巴特沃斯滤波器输出状态变量

  15. // PID控制参数
  16. float kp = 0.0; // 比例系数
  17. float ki = 0.0; // 积分系数
  18. float kd = 0.0; // 微分系数

  19. // 模糊PID控制参数
  20. float e_last = 0.0; // 上一次误差
  21. float ec[3] = {0.0, 0.0, 0.0}; // 误差变化率数组
  22. float u[3] = {0.0, 0.0, 0.0}; // 控制量变化率数组
  23. float u_out = 0.0; // 控制量输出

  24. // 延时函数
  25. void delay(unsigned int n)
  26. {
  27.     unsigned int i;
  28.     while (n--)
  29.     {
  30.         for (i = 0; i < 1000; i++);
  31.     }
  32. }

  33. // 发送24位指令并读取16位数据
  34. unsigned int adc_read(void)
  35. {
  36.     unsigned char i;
  37.     unsigned int data = 0;

  38.     // 发送指令
  39.     ADC_CS = 0;
  40.     ADC_CLK = 0;
  41.     ADC_DIN = 1;
  42.     delay(1);
  43.     ADC_CLK = 1;
  44.     delay(1);
  45.     ADC_CLK = 0;
  46.     delay(1);
  47.     ADC_DIN = 1;
  48.     delay(1);
  49.     ADC_CLK = 1;
  50.     delay(1);
  51.     ADC_CLK = 0;
  52.     delay(1);

  53.     // 读取数据
  54.     for (i = 0; i < 24; i++)
  55.     {
  56.         if (i < 16)
  57.         {
  58.             data <<= 1;
  59.             ADC_CLK = 1;
  60.             delay(1);
  61.             ADC_CLK = 0;
  62.             delay(1);
  63.             data |= ADC_DOUT;
  64.             delay(1);
  65.         }
  66.         else
  67.         {
  68.             ADC_DIN = 0;
  69.             ADC_CLK = 1;
  70.             delay(1);
  71.             ADC_CLK = 0;
  72.             delay(1);
  73.             ADC_DIN = 1;
  74.             delay(1);
  75.         }
  76.     }

  77.     ADC_CS = 1;
  78.     return data;
  79. }

  80. // 零点满度校正
  81. void adc_zero_full_calibration(void)
  82. {
  83.     unsigned int zero_code, full_code;

  84.     // 获取零点码值
  85.     ADC_CS = 0;
  86.     delay(1);
  87.     zero_code = adc_read();
  88.     ADC_CS = 1;

  89.     // 获取满量程码值
  90.     ADC_CS = 0;
  91.     delay(1);
  92.     full_code = adc_read();
  93.     ADC_CS = 1;

  94.     // 计算比例和偏移
  95.     float k = 4096.0 / (full_code - zero_code); // 计算比例系数
  96.     float b = -zero_code * k; // 计算偏移量
  97. }

  98. // 多点线性校正
  99. void adc_multi_point_calibration(void)
  100. {
  101.     unsigned char i;
  102.     unsigned int code[5] = {0x0000, 0x1000, 0x2000, 0x3000, 0x4000};
  103.     float volt[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
  104.     float k[4], b[4];

  105.     for (i = 0; i < 4; i++)
  106.     {
  107.         k[i] = (volt[i + 1].volt[i]) / (code[i + 1] - code[i]); // 计算比例系数 b[i] = volt[i] - k[i] * code[i]; // 计算偏移量 } }
  108. // 将电压转换为温度,根据具体传感器进行修改
  109. float voltage_to_temperature(float voltage)
  110. {
  111. float temperature = (voltage - 0.5) * 100; // 线性转换
  112. return temperature;
  113. }

  114. // 二阶低通巴特沃斯滤波器
  115. float butterworth_filter(float input)
  116. {
  117. float output = b0 * input + b1 * x[0] + b2 * x[1] - a1 * y[0] - a2 * y[1]; // 计算输出值

  118. // 更新状态变量
  119. x[1] = x[0]; // 将当前输入值保存到x[1]中,用于下一次迭代时计算b1
  120. x[0] = input; // 用当前输入值更新x[0]
  121. y[1] = y[0]; // 将当前输出值保存到y[1]中,用于下一次迭代时计算a1
  122. y[0] = output; // 用当前输出值更新y[0]

  123. return output;
  124. }

  125. // 模糊PID控制函数
  126. float fuzzy_pid_control(float setpoint, float process_value)
  127. {
  128. float e = setpoint - process_value; // 计算误差
  129. float ec_now = e - e_last; // 计算当前误差变化率

  130. // 计算当前权重
  131. float w_e = 0.5; // 误差权重
  132. float w_ec = 0.3; // 误差变化率权重
  133. float w_u = 0.2; // 控制量变化率权重

  134. // 计算模糊控制量
  135. ec[2] = ec[1]; ec[1] = ec[0]; ec[0] = ec_now; // 更新误差变化率数组
  136. u[2] = u[1]; u[1] = u[0]; // 更新控制量变化率数组
  137. u[0] = kp * (w_e * e + w_ec * (ec_now + ec[1] + ec[2]) + w_u * (u[1] + u[2])) + // 计算P项
  138.        ki * (w_e * e + w_ec * ec_now + w_u * u[0]) + // 计算I项
  139.        kd * (w_e * e + w_ec * (ec_now - ec[1]) + w_u * (u[0] - u[1])); // 计算D项

  140. // 更新上一次误差
  141. e_last = e;

  142. // 输出控制量
  143. return u_out;
  144. }

  145. void main()
  146. {
  147. float setpoint = 25.0; // 设定温度

  148. // 零点满度校正
  149. adc_zero_full_calibration();

  150. // 多点线性校正
  151. adc_multi_point_calibration();

  152. while (1)
  153. {
  154.     // 抗干扰滤波 --> 巴特沃斯滤波器
  155.     unsigned int adc_result = adc_read(); // 获取ADC采样值
  156.     float voltage = (float)adc_result * k + b; // 转换为电压
  157.     float temperature = voltage_to_temperature(voltage); // 将电压转换为温度
  158.     float filtered_temp = butterworth_filter(temperature); // 进行抗干扰滤波

  159.     // 模糊PID控制
  160.     float output = fuzzy_pid_control(setpoint, filtered_temp);

  161.     // 输出控制信号
  162.     // TODO: your code here
  163. }
  164. }
复制代码


该程序基于51单片机,使用巴特沃斯滤波器对采集到的温度数据进行抗干扰滤波,并使用模糊PID控制算法来实现温度控制。

在主函数中,我们首先进行了零点满度校正和多点线性



2023/4/22 11:11:34

继续

2023/4/22 11:12:00

校正,以提高ADC采样值的精度。在校正之后,程序进入了一个死循环中,不断地从ADC获取温度采样值,并进行滤波和控制。

抗干扰滤波部分使用了二阶低通巴特沃斯滤波器。该滤波器有五个参数:b0、b1、b2、a1、a2。其中,b0、b1、b2是滤波器输入状态变量与输出状态变量的系数,a1、a2是滤波器输出状态变量的系数。这些系数可以根据具体的要求进行调整,以达到不同的滤波效果。

模糊PID控制部分使用了模糊逻辑来处理误差、误差变化率和控制量变化率,以计算出控制量。该算法有四个参数:kp、ki、kd、w_e、w_ec、w_u。其中,kp、ki、kd是比例、积分、微分系数,w_e、w_ec、w_u是三个变量的权重系数。这些参数可以根据具体的需要进行调整,以达到更好的控制效果。

最后,程序通过输出控制信号实现对温度的控制。需要注意的是,在实际应用中,我们需要将控制信号转换为对应的电气信号,并控制温度调节器来实现温度的控制。
51hei2.jpg
51hei.jpg
51hei1.jpg
回复

使用道具 举报

ID:61207 发表于 2023-4-25 07:34 | 显示全部楼层
guobaox1981 发表于 2023-4-22 20:22
以下是一个结合了零点满度校正、多点线性校正、使用二阶低通巴特沃斯滤波器和温度模糊PID控制的51单片机程 ...

人工智能
回复

使用道具 举报

ID:514317 发表于 2023-4-25 09:45 | 显示全部楼层
那里的AI应用??我也想试下
回复

使用道具 举报

ID:879348 发表于 2023-4-25 10:16 | 显示全部楼层
实际完全无法运行
回复

使用道具 举报

ID:309610 发表于 2023-4-27 10:02 来自手机 | 显示全部楼层
AI写的程序不修改肯定是无法直接运行的,我们重点是提出要求ai给出解法,我们利用它给的架构,思路和算法做成子程序然后移植到相应硬件上,说白了是我们直接从亿万程序员的成果中抄答案
回复

使用道具 举报

ID:114694 发表于 2023-4-27 10:58 来自手机 | 显示全部楼层
学习了,时代进步太快了,我辈难以追赶
回复

使用道具 举报

ID:398219 发表于 2023-4-28 10:36 | 显示全部楼层
确实牛逼
回复

使用道具 举报

ID:91165 发表于 2023-4-28 12:42 | 显示全部楼层
也问chat gpt要了2程序,编译通过了还没上机测试
回复

使用道具 举报

ID:373976 发表于 2023-5-5 18:40 | 显示全部楼层
我也测试过让它写代码,还真像那么回事。我开始让它写个STC的1秒延时程序,他用的循环方式。然后我说用定时器方式写个1秒延时程序,他竟然用的挺新的STC15.H的头文件。写的不错,就是没测试能不能通过
回复

使用道具 举报

ID:1065084 发表于 2023-5-8 11:12 | 显示全部楼层
实际用过才知道 GPT3.5绝大部分写的代码都不能直接用,还得调试,可以作为帮助工具,但不能直接用。据说GPT4的好一点,但是我没花那20刀。
最近在用gpt查文献,真的就是傻,他给的文献在期刊中根本没有,都是瞎蒙的。如果有GPT的人可以试试 类似如下的话语: 我不太了解89C51的定时器,请给我几个参考网页 参考文献 ,这样的网页都打不开,文献根本都不存在。

这玩意仅仅是个语言模型 我现在就用他找错别字
回复

使用道具 举报

ID:341045 发表于 2023-5-8 15:41 | 显示全部楼层
谢谢分享, 以后写程序没恩路了试一下
回复

使用道具 举报

ID:309610 发表于 2023-5-8 21:31 | 显示全部楼层
  确实GPT写的代码不能直接使用,GPT4也确实比GPT3.5好用,重点在4的理解能力超强。我现在一直在试用新版bing,新版bing就是免费GPT4,可惜限制很多,对话只能20次超过就要重新开始刷新。上传代码字数限制,一次只能上传很少。我没学过C语言,只看过基本单片机教程,
  现在做法就是想设计一个函数把想法告诉GPT4然后他生成基本架构代码,看看是否试用然后让他添加其他功能,修改参数。最终得到大致框架算法。他很多思路是看教程和别人代码是从没见过的,遇到不懂得代码就让他详细解释和注释,这方面确实超强。是学习的利器
  这几天让AI帮做一个编码器调参程序,程序对一般程序员没啥难度但没有AI之前对我确实超难
对应一个完整系统必须的一环,使用编码器或按键输入,识别快慢反正等,分菜单模式和调参模式。能够完成多种类型参数char ,uchar ,int,uint,long,float修改保存,要调整方便快速界面简单。可以和多级菜单系统中参数表对接。方便移植,适用各种显示器件,找很久也没找到合用的。只好自己编。
   在AI帮助下核心代码都已完成。正在最后组合调试封装。做好会发出来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表