`本人画的第一块电路,肯定存在问题,也还有很大的优化空间(虽然一共没几个功能吧),请大家指教,互相学习。发这篇文章记录一下,也分享一下我的思路和遇到的问题吧。各个部分的功能硬件已经测试了,具体代码我还没写好,先更新这篇电路部分,后续会补上软件部分。
先说一下大致的功能。一块oled屏做显示,9个按键,1个旋转编码器作为数据输入,3个led灯作为显示。
一、供电部分 由于考虑到打算输出到24V,所以直接用的24V供电,同时单片机和oled屏需要用到3.3V,故需要由24V降到3.3V,打算直接LM78M12,但是网上查说直接从24V降到5V的话压差太大容易发热,所以先降到12V,然后再由12V通过S1117-5和S1117-3.3转成5V和3.3V。然后3.3V接了个led灯作为提示。 file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps1.jpg 二、单片机部分 单片机采用的STM32f103c8t6,之前用的这个开发板做过几个小玩具所以比较熟。然后就是单片机外围的复位电路啊,去耦电容啊,晶振啊,还有调试口。由于该单片机没有DA,所以后续的电压调节需要通过pwm信号经过两个阻容变成可调电压。用到的功能大概有:ADC采集输出的电压(有精力后续加上pid算法来实现精准输出,在网上看到某电源是加上pid算法的);PWM输出来调节电压控制模拟量的幅值;IO的基本输入与输出;串口;iic连oled屏;然后一些定时器啊中断啊就不写了。 三、按键部分 file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps2.jpg 由于考虑到会设定一些参数,所以用了比较多的按键。9个正好可以用矩阵按键来控制,6个IO按行扫描来实现9给按键的控制。 具体原理为:将key456配置为上拉输入,key123为推挽输出。将key1置低,key23置高,若key456检测到低电平则按键147被按下;再将key2置低,key13置高,若按键key456检测到低电平则按键258被按下;再将key3置低,key12置高,若按键key456检测到低电平则按键369被按下;如此循环,我是放到一个10ms定时器内,具体程序会在后续的程序部分来说。 四、模拟量部分 由于该0-24V只是用于信号输出所以不会有多大的功率,就只用了一个运放做正向放大,由于怕当输入端pwm信号为0的时候运放正向端不会到0,所以在运放的负向端加上了偏置大约有个0点几伏这样就可以实现0-24V的电压输出。 运放的正向端接的是单片机的PWM信号经过两级阻容滤波产生一个可调的电压值来控制电压的输出。 file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps3.jpg 假设运放正向端输入电压为file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps4.png,运放输出为file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps5.png。 放大倍数还是用虚短虚断来算,先不考虑反向的偏置: file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps6.png ------------------------------------- (1) 通过3.3V经过电阻分压得到的偏置电压大小为file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps7.png(V) -------- (2) 我是这样计算的不知道对不对,实际输出需要满足正向端大于负向端所以式子1中的file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps8.png为单片机控制的电压值减去反向偏置电压,所以最终的输出与输入的关系为: file:///C:UsersMr.gaoAppDataLocalTempksohtml4892wps9.png 五、TTL信号部分 刚开始考虑采用推挽的结构输出(上管NPN下管PNP),后来查电路时偶然翻到一篇文章,说是推挽电路和图腾柱其实是不一样的,推挽的输出大小是受输入信号来控制的,而我只打算用单片机的IO来控制,这样就限制了输出电压的大小。查到用图腾柱电路可以由一个小电压来控制一个大电压。图腾柱的输出相位是和输入相反的,所以单片机启动初始化的时候需要将该信号置高。
`
|