gpio模拟pwm_模拟智能台灯
模拟智能台灯设计
摘 要:本文以STM8单片机为核心设计一款模拟智能台灯设计作品,用LED来模拟台灯,用光敏电阻来检测环境的光照强度,STM8单片机则根据光照的强度来控制LED灯的亮度,光强灯弱,光弱灯强,超声测距仪测试是否有人在前面,还要用它来判断是否是人还是物品挡在了前面,如果是人在前面LED才亮,如果是物品LED灯就不会亮。
关键词:光敏电阻;PWM波;模拟智能台灯;应用;超声测距;
1 设计要求
熟悉应用电子系统的设计流程;熟悉Altium Designer等EDA工具软件的使用;培养在实践中综合运用专业基础知识的能力;熟悉PCB的制作流程与工艺;熟悉元器件的特性;训练焊接技术;以STM8单片机为核心设计一款模拟智能台灯作品,用LED模拟台灯,用光敏电阻检测光照强度,单片机根据光照强度控制LED灯的亮度;利用光照的强度作为台灯的起控点,实现外界的光线较亮时,模拟智能台灯自动关闭,晚上光线较暗时,并且前面有人事,将自动开启智能台灯,台灯的亮度则根据实际外界的光线的强弱度来自动调节。
2 设计方案
根据设计需求,本设计主要包含四个完成步骤:
一是原理与PCB设计:电路应包含超声检测、光强检测、串口通信和LED亮度控制等部分,光强检测的实现参照热敏电阻测温进行,直接用杜邦线连接到最小系统板,超声检测和串口通信也是用杜邦线连接相应模块和单片机最小系统板实现,无需制作PCB;而LED亮度控制尽管可以用一个GPIO输出PWM波直接驱动LED来实现,但本着学习训练的目的,在此给出一个相对复杂一些的电路,包含二阶有源低通滤波器和恒流源。
二是PCB制作与元件焊接:LED亮度控制电路的元器件较少,总共约10来个,包括一个运放MCP6002,一个三极管MMBT5551,一个1206封装贴片LED,几个0603封装贴片电阻和电容,以及一个3pin的单排针。
三是软件设计:作为STM8系列中最低端的一款单片机,STM8S003F3的定时器不多,如果不算看门狗定时器的话只有三个:高级控制定时器TIM1,通用定时器TIM2以及基本定时器TIM4,其中前二者为16bit,后者为8bit且没有输出引脚。高级控制定时器功能比较丰富,通用定时器简化了某些高级特性。TIM1和TIM2都能输出PWM波,本次实验可选用TIM2,用其通道1来输出PWM波。TIM2的通道1对应的引脚为pin1,主功能为PD4。
四是调试与测试:单片机运行PWM波产生模块,在pin1生成占空比为50%的方波,作为激励信号加到LED亮度控制电路的输入端,先用示波器观察低通滤波器输出的波形(运放U1A的输出,pin1),留意此波形的特性,是否有明显波动,电压值为多少等,由此判断低通滤波器工作是否正常。如果没有示波器,用万用表测量滤波器输出电压也能粗略判断滤波器工作是否正常。
3 设计说明(硬件系统)
3.1 原理图设计
在本次实验中我们设计电路图用的是立创里面的软件设计的的电路图,本次的电路我们设计只需要设计一个用PWM(脉冲宽度调制),也就是用脉冲波驱动LED,脉冲的占空比与LED的发光强度紧密关联。而其他的电路连接只需要在外面用杜邦线连接即可。在电路图中恒流源通常用一个电压控制输出电流,称为电压控制电流源(VCCS),其实现方式有多种,针对电流较大的LED驱动,可采用“运放+三极管”的电路形式。恒流源驱动的对象为贴片LED,封装为1206,最大正向电流为25mA。恒流源输入的控制信号为直流电压,为调节输出电流,此电压应能根据需要而变化。为得到一个可控的直流电压,最容易想到的是用数模转换器(DAC)实现。但STM8单片机并未配置DAC模块,而外加一片DAC芯片代价较高,且控制比较复杂。好在单片机内置的定时器可以输出PWM波,经低通滤波后得到其平均值为一直流电压,此直流电压与PWM波的占空比成正比,故控制PWM波的占空比就能调节滤波后直流电压的大小,由此用定时器的PWM输出就能变通实现DAC的功能。低通滤波通常用有源滤波器,如果PWM波的频率与低通滤波的截止频率差距较大(比如100倍左右),用二阶低通滤波器就能达到良好的效果。输入PWM波的频率大约为1kHz,从FilterLab中可以看出,经过此低通滤波器之后,1kHz的衰减约为68dB,交流分量能滤除得比较干净。滤波之后的直流电压幅度最大为3V左右,根据后面的恒流源工作原理,不能用这么大的电压直接去控制恒流源(请思考为什么),所以用电阻R3、R4对其分压后再去控制恒流源。之后的恒流源包括运放U1B,电阻R5、R6,三极管Q1,发光二极管LD1即为最终受控的对象。恒流源为典型的VCCS电路结构,抓住运放的虚短和虚断特性不难分析其原理。如下图3-1所示的电路就是我们自己设计绘制的一个电路原理图:
图3-1
3.2 PCB板设计
在PCB设计中我们也遇到过很多的问题,比如在找封装的时候有些封装里面没有,所以没有办法我们只有找了一些差不多的,记得里面还有一个连一个差不多的都没,然后我们就自己做了一个。还有我们遇到一个问题就是因为学校的资源有限电路板只能用一层不能用多层,所以电路的原件摆放是一个很大的问题,我们试了很久才摆放成功(下面也有我们电路做出来的图片)(PCB版图如图2所示)不过这次的PCB板还是成功的设计出来了。
图3-2
3.3PCB板的制作及元件焊接
在PCB板的制作及原件的焊接中我们使用的个人电脑、打印机、热转印机、热转印打印机、热转印机、钻台、腐蚀槽、电烙铁和焊锡丝。我们开始通过个人电脑和打印机打印出热转印图,然后哈铜板用砂纸打磨干净,然后再把我们打印出来的热转印图用波纹胶布粘贴到铜板上,粘贴好会就可以用热转印机来加热铜板,把热转印机开到175度左右,然后开始加热,一般要加热3次左右。加热完后我们就等它冷下来,然后把上面的胶布撕了,看看电路是否完整,如果不完整就可以用马克笔把没有完整的地方连接起来,然后我们再把它放入腐蚀槽中进行腐蚀,一般腐蚀3分钟就可以了,但是有时候腐蚀一次不行,那我们就可以在进行一次腐蚀。当腐蚀好后就拿出来去洗干净,再一次用砂纸把上面剩到的抹干净,在倒上一些酒精就可以,最后我们最通过给电路板进行打孔,焊接原件,在焊接原件的时候我们是从小的开始焊接的,因为小的要比打的难焊接一点所以先焊接小点要好一点,还有我们焊接集成块时温度调低了一些,因为我们怕温度高了把集成块烧坏了。最后通过一步一步的努力我们就把我们的电路做了出来。(如果所示)
图3-3
4 设计说明(程序设计)
程序测试我们主要分为四个部分1.设计超声测距的程序;2.设计用ADC检测光照强度的程序;3.设计用定时器实现PWM波输出的程序;4.设计用检测到的光照强度、障碍物距离去控制LED等的亮灭以及亮度的程序;下面我们来一一介绍我们的代码程序
1、设计超声测距的程序:可见,MCU需要给出一个10μs的正脉冲作为触发信号,随后超声模块给出一个回响脉冲,脉冲的宽度跟被测距离成正比。测距周期最小为50ms,也就是说测距结果的更新率最高可达每秒200次。
控制某GPIO产生一个10μs的正脉冲作为超声模块的触发信号;
测量回响脉冲信号的宽度。
#define GetPulseNum 20
#define ULTRA_IN_PORT GPIOC
#define ULTRA_OUT_PORT GPIOC
#define ULTRA_IN_PIN GPIO_PIN_4 //PC7
#define ULTRA_OUT_PIN GPIO_PIN_3 //PC6
#define TRIG_ON() GPIO_WriteHigh(ULTRA_OUT_PORT, ULTRA_OUT_PIN)
#define TRIG_OFF() GPIO_WriteLow(ULTRA_OUT_PORT, ULTRA_OUT_PIN)
#define GET_ECHO() GPIO_ReadInputPin(ULTRA_IN_PORT, ULTRA_IN_PIN)
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
void delay_ms(uchar ms)
{
uchar i,j;
while(ms--)
{
for(i=100;i!=0;i--)
for(j=100;j!=0;j--);
}
}
void init()
{
GPIO_Init(ULTRA_OUT_PORT, (GPIO_Pin_TypeDef)ULTRA_OUT_PIN, GPIO_MODE_OUT_PP_LOW_FAST);
//ECHO IN 上拉输入
GPIO_Init(ULTRA_IN_PORT, (GPIO_Pin_TypeDef)ULTRA_IN_PIN, GPIO_MODE_IN_PU_NO_IT);
TRIG_OFF();
}
u16 Frequency_Array[GetPulseNum]={0};
u16 AverageFrequency;
void get_dist()
{
uint16_t tmp_dist = 0, tmp_cnt[2];
uint8_t count = 0;
uint16_t tim_count1 = 0;//, tim_count2 = 0;
TIM1_Cmd(ENABLE);
for (count = 0; count < 2; count++)
{
TRIG_ON();
delay_ms(3); //delay > 10us
TIM1_SetCounter(0);
TRIG_OFF();
while(RESET == GET_ECHO());
//tim_count1 = TIM1_GetCounter();
TIM1_SetCounter(0);
while(GET_ECHO());
tim_count1 = TIM1_GetCounter();
tmp_cnt[count] = tim_count1;//tim_count2 - tim_count1;
}
TIM1_Cmd(DISABLE);
// us / 58 = cm
tmp_dist = ((tmp_cnt[0] + tmp_cnt[1] ) >> 1) / 58;
printf("\r\npresent Get The Frequency is:%ld Hz\r\n",tmp_dist);
}
2.设计用ADC检测光照强度的程序;
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
void delay_ms(uchar ms)
{
uchar i,j;
while(ms--)
{
for(i=4;i!=0;i--)
for(j=100;j!=0;j--);
}
}
void adc_init(void)
{
ADC_CR1_ADON = 1; //打开adc
ADC_CSR_CH = 3; //AIN3脚
ADC_CR1_SPSEL = 2; //4分频时钟
}
uint adc_get(void)
{
uint dataH, dataL;
ulong value = 0;
uint voltage = 0; //电压单位为(mV)
ADC_CR1_ADON = 1; //使能adc
while(ADC_CSR_EOC==0);
dataH = ADC_DRH; //左对齐数据
dataL = ADC_DRL; //读取寄存器数据
ADC_CSR_EOC = 0;
value = dataH<<2|datal;< span="">
voltage = (value*3300)>>10; //计算实际电压
return voltage;
}
3.设计用定时器实现PWM波输出的程序;
CLK->CKDIVR= 0x00; //内部16M时钟不分频
TIM2->PSCR = 0x00; //定时器2预分频系数为1
TIM2->CR1 = 0x01; //内部计数器使能;
TIM2->ARRH = 0x00;//0140,320分频,16M/320=50K,实测49.75K
TIM2->ARRL = 0x8a;//自动装载寄存器低位;实测013e正好为50.0K
/*PWM通道1设置*/
TIM2->CCER1 |= 0x01; //开启OC1信号输出脚
TIM2->CCMR1 = 0x60; //PWM1模式
TIM2->CCR1H = 0x00; //占空比高位
TIM2->CCR1L = 0x37; //占空比低位
TIM2->CCMR1 |= 0x08; //输出比较1预装载使能
/*PWM通道2设置*/
TIM2->CCER1 |= 0x10; //开启OC2信号输出脚
TIM2->CCMR2 = 0x60; //PWM1模式
TIM2->CCR2H = 0x00; //占空比高位
TIM2->CCR2L = 0x37; //占空比低位
TIM2->CCMR2 |= 0x08; //输出比较2预装载使能
/*PWM通道3设置*/
TIM2->CCER2 |= 0x01; //开启OC3信号输出脚
TIM2->CCMR3 = 0x60; //PWM1模式
TIM2->CCR3H = 0x00; //占空比高位
TIM2->CCR3L = 0x37; //占空比低位
TIM2->CCMR3 |= 0x08; //输出比较3预装载使能
TIM2->CR1 |= 0x01;
5 、最后的合成程序
int main(void)
{
/* Infinite loop */
CLOCK_Config();//系统时钟切换为HSE(8MHz/4=2MHz)
GPIO_Config();//超生波触发引脚
//CLK_init();
TIM1_Config();
Init_Tim2();
uart_conf();
/* ADC模块初始化 */
adc_init();
asm("rim"); //enable interrupts
static uint tmp=0;
char cnts=0;
printf("\r\n硬件平台为:%s\r\n","iCreate STM8 开发板");
while(1)
{
setchar(tmp);
x=adc_get();
PA_ODR_ODR1 =1;//保证最短10us的低电平
for(cnts=15;cnts>0;cnts--);
PA_ODR_ODR1 =0;
for(cnts=2;cnts>0;cnts--)
{
delay();
}
if(bFinish_Flag==1)
{
//1000000us/2000000=0.5us
//340(m/s)=34/1000(cm/us)=0.034cm/us
tmp=(float)tim2_ccr2*0.1*0.017-6;
bFinish_Flag=0;
}
if(tmp<20&&x>400)
{
setpwm((int)(((float)x*0.075)-35.0));
}
else
{
setpwm(0);
}
// asm("wfi");
printf("当前距离:");
SendChar(arr[0]);
Delay_ms(5);
SendChar(arr[1]);
printf("cm");
SendChar('\n');
delay();
}
}
5 调试及实际验证结果
5.1 硬件测试结果
5.2 软件与系统测试结果
6 结论
怎么说呢,这次的实验对我来说,是一个很大的挑战。可能部分同学不以为然,认为这个任务就是一个普通的任务,再简单不过。但是你要考虑我们这些基础比较差的同学呀,付出了很多可能还是做不出来,但是他们却能轻松完成,这真是打击。我相信这世上真有天赋之说,像我这种悟性差的人,为了赶上他们,只有付出更多的努力和汗水,可能还是像这次实验,还不如人家。我有觉得我已经在兢兢业业,勤勤恳恳学习stm8单片机课程,但是后来的实验我还是一窍不通,我不知道怎么回事。到网上查阅资料还是一无所获,线上悻悻而归,线下我就去问老师同学,这才算是有了一些收获。大家都在做实验课程,我也不好多问,大部分问题还是请教的老师。不过,正因为有了他们的帮助,我才能完成这次的实验内容。前面画电路图,做实物都还比较简单,后面软件编程真的让我头大,真是不会呀,太难了!去找例程的代码,改来改去还是存在很多问题,当时我真的放弃了。但是看到后来那么多同学都做好了,我简直不敢相信,我决定再努力一下,一定要做出来!感谢自己的努力,费尽心力我最终还是做出来了!做出来后的那种成就感简直是不可言喻,我从来没觉得自己这么高兴过。正因为这次的成功,我对st单片机有了一些更想深入学习的欲望,还好当时没彻底放弃。不过说真的,一个人做的话,真的是艰辛,还好这次分了组,负担一下就减轻了许多,我们各自分工,他去焊板子的时候我就看代码,即使看不懂…我们一起上网查资料,却发现网上关于stm8的资料极少,还好有老师给的例程。网上算是没什么收获,问同学的话,有一些收获,还有老师也给了我很大帮助,加上自己本身的一些理解,看懂一些简单的代码还是没问题的。不管怎么说,我还是做出来了。这次实验虽然很困难,但是做出来的话真的会有很大成就感,对我来说的话是这样,不知道他们怎么想。通过这次的实验,我也明白了团队分工协作的重要性。以前吧,我总是独来独往,做什么事都是自己一个人完成,这次之后,哇,仿佛发现了新大陆一般,协作的感觉真的不错,负担也减轻了好多,效率飞一般的提升,今后我也会更多的考虑解决问题来找一个队友合作。
gpio模拟pwm_模拟智能台灯相关推荐
- 用计算机代替人说话,人工智能是用计算机来模拟人的智能,代替人的部分脑力劳动...
人工智能是用计算机来模拟人的智能,代替人的部分脑力劳动.人工智能既是计算机当前的重要应用领域,也是今后计算机发展的主要方向.人工智能应用中所要研究和解决的问题难度很大,均是需要进行判断及推理的智能性问 ...
- 电脑生成siri语音_米家智能台灯1S全新升级,支持小爱和Siri的语音控制
夜晚的灯光是我们最为需要的东西,但很多时候,我们需要灯照在不同的地方,平时我只靠吸顶灯的光来照亮家里的每一个角落,甚至是看书的时候都只靠吸顶灯照明.台灯作为占用面积小,光照均匀,让很多的人越来越依赖它 ...
- 大力智能台灯T6 结构拆解
近几年教育硬件产品层出不穷,教育硬件赛道布局时间较长的有网易.讯飞.步步高系等公司,2020年10月,字节跳动旗下大力教育经过两年多的调研和研发,高调推出首款智能硬件产品"大力智能作业台灯& ...
- 基于51单片机的智能台灯设计
具体实现功能 系统由STC89C52单片机+L数码管+光敏电阻+人体感应模块+红外接近传感器模块构成. 具体功能: (1)亮度不够且有人靠近时台灯自动亮: (2)靠的太近会提醒坐姿不正(蜂鸣器): ( ...
- 基于单片机病房呼叫系统数码管显示房号设计-基于单片机工业生产现场的光照强度控制设计-基于单片机多功能智能台灯设计-基于单片机二维码LCD显示设计-基于单片机多功能时钟闹钟万年历控制系统设计【毕设分享】
1641基于单片机病房呼叫系统数码管显示房号设计 设计思路:此设计实现的功能通过按键模拟房号,当按键按下时会将房号编号发送到数目管上进行显示,并通过声光进行提示.包含的电路有:数码管显示电路.按键电路 ...
- 设计一款懂人所想的智能台灯
摘要:基于STM32单片机和机智云硬件开发平台,设计了一款智能台灯.在设计中融合了光电传感器.光照强度传感器.温湿度传感器.WiFi通信模块等一些常用的传感器,在台灯普通照明功能的基础上,提出并设计了 ...
- 驱动级模拟驱动级模拟:直接读写键盘的硬件端口!
驱动级模拟驱动级模拟:直接读写键盘的硬件端口! 有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的 ...
- 大力智能台灯与飞利浦台灯 智能调光功能体验
目前市面上绝大部分智能台灯几乎都宣称有自动调光功能,即台灯随环境光变化自动调节LED光的亮度,或者台灯在固定环境光下,一旦开启了自动调光模式LED灯将自动调光至一个最适合读写作业的亮度: 下面对比体验 ...
- lammps计算聚合物例子_LAMMPS模拟聚合物结构,非晶态聚合物变形行为的模拟,纳米线变形模拟,单轴张力模拟,晶格参数计算...
推荐一个网站,上面有LAMMPS模拟聚合物结构,非晶态聚合物变形行为的模拟,纳米线变形模拟,单轴张力模拟,晶格参数计算的lammps脚本,如下面是晶格参数计算的lammps脚本,具体网址是: LAMM ...
最新文章
- 【Netty】Netty 核心组件 ( ChannelHandlerContext )
- Android自定义控件(四)仿网易客户端上拉加载更多
- Jquery中 实现气泡消息提示
- VTK:BrownianPoints布朗点用法实战
- leetcode 743. Network Delay Time | 743. 网络延迟时间(邻接矩阵,Dijkstra 算法)
- linux本地yum源与软件包管理,【Linux系统中的】本地yum源的搭建与使用yum源进行软件的下载...
- 以ABP为基础架构的一个中等规模的OA开发日志
- CenterOS 服务器之MySQL卸载与安装,并远程连接
- python-pygame声音模块的使用
- android怎么让图片显示在button上面_opencv怎么样可以实时显示图片HSV值
- 如何做好手机APP测试?APP测试流程及解决方案
- 自动加减工单结存算法实现
- Sci-hub最新变种网址
- Android开发---图片渲染问题----真的很严重
- shell脚本编程基础(上)
- 卷积神经网络的参数计算
- cvpr2020 人脸检测与识别_就CVPR2020的来看,目前人工智能的研究热点有哪些进展?未来的研究趋势会有什么变化?...
- 详解旨在提升EVM底层性能的兼容公链Monad
- SpringCloudAlibaba【四】Nacos Config 多环境切换与公共配置
- 夜天之书 #49 开源软件的技术写作
热门文章
- 数据查找matlab,MATLAB:使用矢量化查找已排序数据的统计信息
- 新款苹果电脑_苹果发布新款MacBookAir 搭载M1芯片7999起
- TP5的目录常量和路径
- java jps监控_记录java虚拟机性能监控工具(jps与jstat)的使用
- 替换url中的参数值
- rabbitmq常用的五种模型
- linux的无密码登录,linux 无密码登录
- mysql去掉秒杀场景_秒杀场景下mysql减库存逻辑优化
- java svnkit_java svnkit实现svn提交,更新等操作
- c语言哪个编译软件能够将整个工程自动生成调用图_这10个C语言技巧让初学者少走180天弯路!...