一步步拆解STC32G屠龙刀示波器开源程序,边学边用。

一,多年的宿愿
上学时,就想着自己有空搞个自己的示波器硬件和软件
但,DIY示波器涉及的技术知识点还是很多的,
所以,一直没能完成理解,没学透。

二、近期买到一个STC32G新出的开源示波器,
感觉硬件和软件都相对容易学习,
所以就试着把软件原理拆解拆,一边拆一边自己学习学习。

1、拆解一周,只拆解了一开头
2、针对目前的这个程序原理来说,示波原理
(1)先做一个绘图功能函数
(2)用定时器快速采集AD存储起来
(3)用DMA模式实现快速绘图显示
(4)用定时器做个PWM的波形输出
(5)有了PWM与AD采集显示,基本就能完成一个可输出,可采集的DIY示波器


三、软件原理 

1、先给驱动接上个TFT,显示文字和数字
早期,没买到开发板之前,自己手工搭了一个TFT屏进行软件测试
还算幸运,很容易接通了。


2、有了TFT显示屏,自然,重要的是如何显示曲线和表格了
(1)首先建立一个数组来作波形曲线图的数据存储
(2)建立绘表格、会曲线点的函数,

3、建立AD采集函数,把数据存储到波形曲线图的数组中

4、通过绘图函数,快速把曲线绘制出来

四、一步一步重新搭建
逻辑说起来是相对容易的,但直要一步步去实现,还是有很多困难的
所以,我自己参考这个开源的程序,慢慢从头建立一个新的工程,
把每一步节点,分成了独立的工程文件
就象楼梯一样,一步一级的向上搭建

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面给您提供一个基于STC32G使用PID算法控制舵机转向的示例程序,希望可以帮助您理解PID算法在舵机控制中的应用。 ```c #include <STC32.H> #include <math.h> #define PWM_PERIOD 20000 // PWM周期为20ms #define PWM_MIN 1000 // PWM最小脉宽为1ms #define PWM_MAX 2000 // PWM最大脉宽为2ms #define KP 0.5 // 比例系数 #define KI 0.1 // 积分系数 #define KD 0.2 // 微分系数 unsigned int adc_value; // 模拟输入值 float error, last_error = 0, integral = 0, derivative; // PID算法相关变量 unsigned int pwm_value; // PWM输出值 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = t; i > 0; i--) { for (j = 200; j > 0; j--); } } void adc_init() // 模拟输入初始化 { P1ASF = 0x01; // 将P1.0设置为模拟输入 ADC_RES = 0; // ADC转换结果清零 ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_PORT0; delay(1); } unsigned int adc_read() // 读取模拟输入值 { ADC_CONTR |= ADC_START; while (!(ADC_CONTR & ADC_FLAG)); ADC_CONTR &= ~ADC_FLAG; return ADC_RES; } void pwm_init() // PWM输出初始化 { P2M0 |= 0x10; // P2.4设置为推挽输出 P2M1 &= ~0x10; PWMCFG = 0x00; // PWM时钟源选择Fosc/4 PWMCR = 0x8E; // PWM输出使能,PWM计数器启动,自动重装载,PWM输出低电平有效 PWMP = PWM_PERIOD; } void pid_control() // PID算法控制舵机转向 { error = adc_value - 2048; // 计算当前误差 integral += error; // 计算误差积分值 derivative = error - last_error; // 计算误差微分值 pwm_value = (int)(KP * error + KI * integral + KD * derivative); // 计算PWM输出值 if (pwm_value > PWM_MAX) pwm_value = PWM_MAX; // 防止PWM输出超过最大值 if (pwm_value < PWM_MIN) pwm_value = PWM_MIN; // 防止PWM输出低于最小值 PWMC = pwm_value; // 设置PWM输出值 last_error = error; // 保存当前误差 } void main() { adc_init(); // 模拟输入初始化 pwm_init(); // PWM输出初始化 while (1) { adc_value = adc_read(); // 读取模拟输入值 pid_control(); // PID算法控制舵机转向 delay(100); // 稍作延时 } } ``` 在这个程序中,我们使用了STC32G的ADC模块读取模拟输入值,并使用PID算法计算PWM输出值,控制舵机转向。具体的实现步骤和注释已经在代码中给出,请您仔细阅读并理解。如果您有任何疑问,欢迎随时向我提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值