shipeng

个性签名:模电临时工

  • 2020-08-15
  • 回复了主题帖: 新入职小白:公司就我最闲,师傅派我去写bootloader

    nmg 发表于 2020-8-14 15:38 要不要分享下经验
    给你个资料先看看  

  • 2020-08-14
  • 回复了主题帖: 串口一次性发送14k数据,单片机如何接收

    参照STM32的boot loader例程和说明里面详细描述了超级终端怎么使用,例程里面有ymodem的CRC算法例程可以直接拿来用

  • 回复了主题帖: 新入职小白:公司就我最闲,师傅派我去写bootloader

    用过STM32的boot loader,而且仅限于STM32直接移植官方例程分分钟搞定

  • 2020-07-23
  • 回复了主题帖: 过零开关的功率控制精度与时间延迟精度的悖论

    事情到了这里似乎又产生了一个新的“悖论”,太分散和太快速又是一个矛盾。最终我的做法是分散性做出妥协,但快速性未做让步。具体解决方案是:分散值为一个固定值,拿1/100的功率分辨率来说将占空比固定分散为10份,如不够10则遵循左对齐原则,余数插入也遵循左对齐。最终控温效果可以解决“红暗交替”和控温不稳的问题。

  • 2020-07-22
  • 回复了主题帖: 过零开关的功率控制精度与时间延迟精度的悖论

    chunyang 发表于 2020-7-22 15:00 感觉应该是“分散”和“快速性”算法冲突了,导致超调所致。另外,尽量以交流整周期为 ...
    不错,我也确实也考虑过这个问题,但考虑到这会进一步牺牲功率分辨率或加剧发热丝红暗交替问题时我还是犹豫了,不过最终因为这个方案实际测试控温效果不佳最终并没有采用。

  • 回复了主题帖: 过零开关的功率控制精度与时间延迟精度的悖论

    aallian 发表于 2020-7-22 11:36 关于红暗交替问题,达到目的温度后,如果楼主固定功率输出,控制占空比均匀分散。 是否有帮助?
    使用“占空比均匀分散”后是可以解决我所提到的“发热丝红暗交替”的问题的,只是实际AD值抖动比“集中占空比”的更大

  • 回复了主题帖: 过零开关的功率控制精度与时间延迟精度的悖论

    本帖最后由 shipeng 于 2020-7-22 10:23 编辑
    aallian 发表于 2020-7-21 21:10 很佩服楼主的态度! 个人一点点看法(也许不专业,无怪)功率和温度并不是线性关系。 和环境温差越大,散 ...
    你说的这个问题属于静态温漂,其实由于环境的变化而引起的温度波动是难免的。我说的控温精度1度,主要是说设定目标温度要能分辨±1℃,否则设定温加减1度后实测温度却没有变化这就是控温精度不够的表现。

  • 2020-07-21
  • 发表了主题帖: 过零开关的功率控制精度与时间延迟精度的悖论

    本帖最后由 shipeng 于 2020-7-22 11:04 编辑 使用PID控温差不多有4年了,有一个问题一直困扰我至今。曾经以为这个问题是个悖论只能寻找此消彼长的微妙平衡再无任何解决方案,但其实我错了就在前不久一个灵光乍现的清晨我在睡梦中居然找到了答案。具体问题是这样的:“有一个可调温控温装置(其实是热风拆焊台)调温范围:100~500摄氏度,要求控温精度±1℃以内。” 根据以上问题描述,由于控制温度高低的唯一办法是控制单位时间T内的平均加热功率P,假定供电电压不变加热占空比D的大小决定恒温的温度值。这就可以得到温度和加热占空比D呈一一对应关系。100~500度就需要至少400分之一的功率控制精度,但实际上由于市电的频率只有50Hz还要做到过零开关,最小功率控制精度是半个市电周期th=10ms,根据 “P=D*发热丝饱和功率/400” 得400分之一的精度对应占空比周期为:400*10ms=4秒,这对于控制热风这种比热小的介质来说是根本无法容忍的,你会发现无论你怎么调整PID的参数都始终不能实现恒温。当然如果采集温度的AD分辨率足够高你可以不需要如此高的功率分辨率,你可以在温度还在1度以内变化时提前做出功率补偿使温度始终在1度以内上下浮动这样也能满足要求。经过实验我发现功率精度最低可以降到1/50,此时的加热周期T=50*10ms=0.5秒,但此时肉眼还是可以明显的看到发热丝的红暗交替,可能是由于采温热电偶的滞后性导致实际AD却是平稳的,如用热电偶测温仪实测温度也是稳定的。以上就是我四年前的解决方案,只是发热丝的红暗交替问题让我不太舒服。     直到我看到了某大厂做的热风控温产品,在保证控温精度的前提下肉眼几乎看不出发热丝的红暗交替现象。我便知道这个问题另有出路,于是我便开始一直在寻求这个终极解决方案也就有了前文所提到的灵光乍现的瞬间。这个思路说来也简单:如下图假如占空比周期T为10个市电半周,占空比D=5,按照通常的控制思路是这样的: 每次打开5个半周后会有5个半周关闭,如果按照1/50的功率控制精度就有:250ms开加热,250ms关加热这样做当然会造成热风温度的短时波动。终极解决方案是这样的:将上图中的ON和OFF打散再让他们充分混合得到你中有我我中有你的效果: 这样整体效果还是5个市电半周开5个市电半周关,也就是占空比依然是5/10.当然5/10是个特例,如果1/50的功率精度占空比为27/50应该怎么办呢?可理解为27个开和23个关,将27/23等于1余4,即为开和关为1:1余4,也就是一次开后就有一次关但23个开关周期后还多余4个开没有打开,这应该怎么办呢?办法就是把这4个开再分散到那23个开关周期中去:也就是23/4=5余3,现在可以把余数忽略了,最后输出结果是每5个ONOFF周期多插入一个ON这样就可以得到最大限度分散的27/50的占空比了。当然口说无凭为了直观的验证这个方案特引入一个验证算法的好方法:利用微软的Visual Studio验证并打印出实验结果: 实验代码: 实现1/100功率分辨率的分散占空比控制效果: #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main(void) { for (uint8_t heat_duty = 0; heat_duty <= 100; heat_duty++) { uint8_t i, j, k, l, m, sub_t, pos_nag,on_cycles=0,off_cycles=0; _Bool HEAT1ON_A; i = heat_duty; if (i > 50) { j = 100 - i; pos_nag = 1; } else { j = i; i = 100 - j; pos_nag = 0; } sub_t = i == 0 || j == 0 ? 100 : i / j + 1; l = j != 0 ? i % j : 1; if (l == 0)l = 1; for (uint8_t period = 0; period < 100; period++) { k = period; m = k / (j / l * sub_t + 1); m = j==0 ? 0 : m > l ? k - l : k - m; HEAT1ON_A = m % sub_t == sub_t >> 1 ? !pos_nag : pos_nag;//k < j* sub_t && k % sub_t == sub_t >> 1 ? !pos_nag : pos_nag;// if (HEAT1ON_A)on_cycles++; else off_cycles++; printf(HEAT1ON_A!=0?"*":"-"); } if (heat_duty!=on_cycles || on_cycles+off_cycles!=100)printf("%d,%d/%d\n", heat_duty,on_cycles,off_cycles); else printf("\n"); } return 0; } 运行结果:( ‘ * ’ 表示开,‘ - ’表示关)                                                                    占空比0~50                                                              占空比51-100 经过以上验证后发现逻辑上是没有问题的可以实现0-100内任意占空比的分散混合开关效果,但实际控温效果却差强人意,温度居然还没有原来不分散的稳定。这个脸实在打的让人猝不及防,本着严谨的求知态度步步为营却依然被现实打脸。哪位高人过来解释一下问题究竟出在哪里?在这里我也给出一个我的解释:可能是由于我的占空比控制是实时更新的,我并不会等到整个占空比周期结束后再更新占空比值,而是每次过零我都会根据当前的温度AD值重新计算占空比,我认为这样才能保证快速的反应能力,否则加热时负载的变化就不能及时的做出反应。但是在分散开关占空比控制中由于开和关是错开的,在一个占空比周期中占空比的邻近抖动可能会得到意想不到的效果:本来是降低加热功率反而会得到更高的功率,因此就会导致温度的不稳定。

  • 2020-05-09
  • 发表了主题帖: 关于LCD的多种颜色比例混合计算

    本帖最后由 shipeng 于 2020-5-9 15:24 编辑 本人突发奇想:可否将LCD字模按需求比例缩小显示,从而将所有大小的字体共用一套点阵数据表。这么做还有一个好处就是缩放显示小字体的时候字体边缘会有灰度效果从而视觉上会比较柔和。当然要做到这个柔和的效果需要通过算法检测字体边缘并根据边缘笔画的粗细计算颜色的灰度。乍一听可能大家会以为这套算法很厉害的样子,甚至于担心单片机会不会运算不过来?其实不然我举个例子你就知道了: 例如我想将32*32字体和16*16字体共用一套点阵数据表,那我应该怎么做呢?首先要做到字体边缘更和谐点阵数据表当然要用32*32的。接下来我们要怎么显示16*16的字体呢?其实也很简单就是拿到目标字符的32*32点阵数据后,每次X方向取两个像素同时Y方向也要取两个像素的数据。再根据取到的这4个像素数据计算你要点亮像素的颜色,如果这4个像素都为0那就显示背景色,4个像素1个=1,3个=0就根据公式:混合后红色分量 =(字体色红色分量*1+背景色红色分量*3)/(1+3),混合后绿色分量 =(字体色绿色分量*1+背景色绿色分量*3)/(1+3),混合后蓝色分量 =(字体色蓝色分量*1+背景色蓝色分量*3)/(1+3)。另外还有2个像素为1,2个为0;3个像素为1,1个为0;4个像素都为1;等情况依此类推最后将计算得到的混合后红/绿/蓝色分量进行混合即得到你要点亮的那个像素的颜色。 以下是实现该功能的源代码: static uint16_t CalcMixedColor(uint16_t c1,uint16_t c2,uint16_t i,uint16_t j)//__attribute__((section("RAMCODE"))) { uint16_t r,g,b; b =((c1&0x1F)*i + (c2&0x1F)*j)/(i+j); c1 >>= 5;c2>>= 5; g =((c1&0x3F)*i + (c2&0x3F)*j)/(i+j); c1 >>= 6;c2 >>= 6; r =((c1&0x1F)*i + (c2&0x1F)*j)/(i+j); return (r<<11|g<<5|b); } static void LCD_Show16x16sym(uint16_t x,uint16_t y,uint8_t blk,uint8_t seg,uint16_t f_c,uint16_t b_c) { if (blk<0xB0 || seg<0xA1 || x>LCD_Width-16 || y>LCD_Height-16)return ; uint32_t font_buf[32]; UINT br,chs_ofs=(94*(blk-0xB0)+seg-0xA1)*32*4; uint16_t color_pad[5]; color_pad[0]=b_c; color_pad[4]=f_c; color_pad[1]=CalcMixedColor(f_c,b_c,1,3); color_pad[2]=CalcMixedColor(f_c,b_c,2,2); color_pad[3]=CalcMixedColor(f_c,b_c,3,1); if (FR_OK!=f_lseek(&Font_dat,chs_ofs) || FR_OK!=f_read(&Font_dat,font_buf,32*4,&br)) { for (uint16_t i=0;i<32;i++)font_buf=0xFFFFFFFF; } if (f_c!=b_c) { LCD_SetWindows(x,y,x+16-1,y+16-1); for(uint16_t i=0;i<32;i++) { uint32_t temp[2]; temp[0]=font_buf; temp[1]=font_buf[++i]; for(uint16_t j=16;j>0;j--) { uint8_t pan=(temp[0]&1)+(temp[1]&1); temp[0]>>=1;temp[1]>>=1; pan += (temp[0]&1)+(temp[1]&1); LCD_WR_DATA(color_pad[pan]); temp[0]>>=1;temp[1]>>=1; } } } else { for(uint16_t i=0;i<16;i++) { uint32_t temp[2]; temp[0]=font_buf[i*2]; temp[1]=font_buf[i*2+1]; for(uint16_t j=0;j<16;j++) { uint8_t pan=(temp[0]&1)+(temp[1]&1); temp[0]>>=1;temp[1]>>=1; pan += (temp[0]&1)+(temp[1]&1); if(pan!=0)LCD_DrawPoint(x+j,y+i,color_pad[pan]); temp[0]>>=1;temp[1]>>=1; } } } } 现在有个问题我解释不通:当字体色是黑色背景色为淡蓝色时是有预想的效果的,但把字体色换为红色后不知道为何字体边缘会出现黑色?

  • 回复了主题帖: STM32L151读取W25Q16的ID错误,请帮忙看看是什么原因

    你这个问题我也遇到过,最后在上电后读ID前加一条唤醒指令解决了SFLASH_RELEASE_POWER_DOWN 0xAB                     //释放掉电

  • 2020-04-21
  • 回复了主题帖: HAL库,真的不敢用了!

    ddllxxrr 发表于 2017-7-27 07:59 那么请用标准库,但标准库好像不支持STM32F429,所以,希望ST能继续出标准库。
    兄台何出此言,我就用标准库成功编写过F429的程序

  • 2019-12-31
  • 回复了主题帖: STM32F429单片机HAL库ADC配置问题

    niaonnn 发表于 2019-11-4 10:17 我也碰到这个问题,但是不适用的HAL库,请问你这个IO配置具体是哪里的问题啊?
    时隔一年多了,我也记不清当时的具体原因了,从我的回复内容来看应该是GPIO初始化有问题没有配置成模拟输入状态

  • 2019-10-17
  • 回复了主题帖: 格物致知06之一 滴水起电机

    maychang 发表于 2019-10-16 20:29 第一、液柱不可能连续,落下一段距离后必定要断开,因为液体下落的距离与时间平方成正比。 第二、如果 ...
    如果液柱或液滴与大地之间是电容的关系呢?

  • 2019-10-16
  • 回复了主题帖: 格物致知06之一 滴水起电机

    PowerAnts 发表于 2019-10-12 13:54 当时曾想过弹射带电体在飞行过程中产生高压取代电警棍,但是在地表飞行是以大地为参考点的,显然失败了, ...
    如果将发射端接地,并且发射的带电体换成生理盐水,液柱直径尽可能细这样就可以连续发射不知道有没有搞头?

  • 2019-08-27
  • 回复了主题帖: 电蚊拍能电死蚊子却对人不会有伤害,是什么原理?电压高 时间短?那不是和ESD静电...

    抛开剂量谈毒性就是耍流氓

最近访客

< 1/2 >

统计信息

已有41人来访过

  • 芯币:1217
  • 好友:--
  • 主题:32
  • 回复:208
  • 课时:--
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言