家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生 家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生
您的位置:网站首页 > 电器维修资料网 > 正文 >

STM32 :用PWM的方法实现荧火虫灯

★★★★★【文章导读】:STM32 :用PWM的方法实现荧火虫灯具体内容是:复制一份到自己练习用的文件夹中,建立工程。先阅读readme.txt及源程序,了解一些基本信息。从程序中可以知道:(1)使用tim3(2)定时器的时钟频率是36mhz.(3)pwm信号的频率是36khz,这是通过tim3的arr来设置的。…

来源: 日期:2013-12-5 10:33:16 人气:标签:

STM32 :用PWM的方法实现荧火虫灯

      复制一份到自己练习用的文件夹中,建立工程。

      

      先阅读readme.txt及源程序,了解一些基本信息。

      从程序中可以知道:

      (1) 使用tim3

      (2) 定时器的时钟频率是36mhz.

      (3) pwm信号的频率是36khz,这是通过tim3的arr来设置的。arr的值是999,因此pwm的频率是36mhz/(999+1)=36khz。

      (4) 四个通道的占空比分别由tim3_ccr1~tim3_ccr4来确定,算式是:

      (tim3_ccr1/ tim3_arr)* 100

      由此,当pwm的频率是36k时,占空比分辨率接近0.1%。降低频率,可以获得更高的分辨率。

      要完成灯的渐亮和渐灭控制,只要定时改变tim3_ccr1的值就行了。

      如何改变呢?这里用到stm32提供的系统定时器(systick)

      数据手册中关于这个定时器的描述如下:

      -------------------------------------------------------------

系统时基定时器

      这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:

      ● 24位的递减计数器

      ● 自动重加载功能

      ● 当计数器为0时能产生一个可屏蔽系统中断

      ● 可编程时钟源

      而它的使用方法可以在库提供的例子中找到。

      有一个初始化函数:

      void systick_configuration(void)

      {

      if (systick_config((systemfrequency) / 10)) //经实际测试发现,除以10是100ms,除以100是10ms,依此类推

      {

      /* capture error */

      while (1);

      }

      nvic_setpriority(systick_irqn, 0x0);

      }

      这里将其初始化为每100ms产生一次中断。

      将这个函数放在main.c中,在main函数中调用它,即完成初始化工作。在system32_it.c中有中断处理函数。

      void systick_handler(void)

      {}

      原例子中这里没有写代码,可以根据需要自行增加相关代码来处理每100ms时间到的事件。

      代码如下:

      extern uint16_t dutyratio;

      extern uint8_t changduty;

      void systick_handler(void)

      { static uint8_t counter;

      if(counter》16)

      dutyratio-=62;

      else

      { dutyratio+=62;

      if(dutyratio》999)

      dutyratio=999;

      }

      if(++counter》=32)

      counter=0;

      changduty=1;

      }

      这里定义了两个变量,一个是dutyratio,用来控制占空比的变化。它在main.c中定义,并初始化为6。初始化tim3_ch1通道时使用该变量。

      22

      每次中断则视情况增加或者减少,每次变化的量是62。在systick_handler函数中,定义了一个static型的变量counter,它的值在 0~31之间变化。当其值在0~15之间时,dutyratio每次加1,这样一共是加16次,即其最终的值是:6+16*62=998,正好比arr的值小1。当counter的值在16~31之间变化时,dutyratio每次减62。这样,dutyratio的值始终在6~998之间变化,对应的是占空比在:

      6/999*100%=0.6% ~ 998/999*100%=99.89% 之间变化。

      changduty是一个标志,用途是通知main函数,占空比已发生变化,要求更新ccr1。mina函数的处理如下:

      while (1)

      { if(changduty==1)

      {

      tim3-》ccr1=dutyratio;

      changduty=0;

      }

      }

      在用软件仿真时,执行到tim3-》ccr1=dutyratio;时,外围部件中的相应值并没有立即变化。目前还没有弄清楚是调试器的问题还是确实不立即发生变化。

      1副本.jpg

      使用硬件来测试,由于我手边的板子tim3_ch1上没有接led,所以就看不出灯亮的效果了,不过,不要紧,还有示波器。将程序下载入flash后运行,观察gpioa.6,可以看到非常漂亮的波形。用万用表电压档测该引脚的电压,可以看到电压平稳地上升和下降。所以,我有些怀疑上面提到的那个ccr1没有立即变化仅仅只是调试器的问题。//蓝色的字这个不对,下面有说明。

二、用pwm生成正弦波

      有了pwm,自然就可以用pwm的方法生成正弦波了。下面生成500hz正弦波的方法参考自张明峰的《pic单片机入门与实践》

      每个正弦波分成四个像限,每个像限16点,共64点,每点出现2个pwm周期,故pwm的周期为:2ms/128=156.25us,频率为64khz。

      tim3 frequency = tim3 counter clock/(arr + 1)

      倒过来:

      arr=tim3 counter clock/tim3 frequenc - 1 =562.5-1 =561

      如果取arr的值是561的话,那么实际的频率是64.056khz,即最终生成为的正弦波频率是:500.4hz

      有了arr,占空比就取决于ccr1的值了,使用excel可以方便地计算出第一象限的16个点的数据:

      280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559

      有了第一象限,其他象限都可以镜像生成了。具体方法请看源程序。

      要用上面的例子修改,还需要做一些工作。

      前面是在systick中做出标志,然后在主程序中修改ccr1的值,现在不行了,肯定会有时间的误差,不能这做么,要在pwm输出后修正,这样就要在pwm波形输出时产生中断。因此,需要在main函数中增加以下这个函数。

      1.jpg

      这个函数哪里来的呢,很简单,从timebase工程中中抄来的然后将tim2改成tim3就行了^_^。然后在main函数中调用它。

      注意,还需要打开stm32f10x_conf.h文件,将下面:

      44

      蓝色框里面的包含文件给“解放”出来。当然,同时要把库中的misc.c源程序文件加入工程中来。否则,编译是通不过的。

      为了让通道1可以产生中断,还需要做一件事,就是下面蓝色的部分。

      /* tim it enable */

      tim_itconfig(tim3, tim_it_cc1, enable);

      //也是从timebase工程中抄来,再将tim2改成tim3的。

      /* tim3 enable counter */

      tim_cmd(tim3, enable);

      现在该到stm32f10x_it.c中去了,增加一个中断处理函数:

      uint16_t sintab[]={280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559};

      uint8_t count1,count2; //1.像限计数器,其值在0~3之间变化 2.其值在0~31之间变化

      void tim3_irqhandler(void)

      {

      if (tim_getitstatus(tim3, tim_it_cc1) != reset)

      {

      tim_clearitpendingbit(tim3, tim_it_cc1);

      if(count2%2==0) //准备更新,新的值会在下一次更新

      { switch(count1)

      { case 0: //象限1

      {

      tim3-》ccr1= sintab[count2/2];

      break;

      }

      case 1: //象限2

      { tim3-》ccr1=sintab[15-count2/2];

      break;

      }

      case 2: //象限3

      { tim3-》ccr1=560-sintab[count2/2];

      break;

      }

      case 3: //象限4

      { tim3-》ccr1=560-sintab[15-count2/2];

      break;

      }

      default:break;

      }

      }

      }

      if(++count2==32)

      { count2=0;

      if(++count1==4)

      count1=0;

      }

      }

  • 1
  • 2
  • 下一页

【看看这篇文章在百度的收录情况】

联系方式

  • 0731-85579057 , 0731-85569651
  • 点击这里给我发消息点击这里给我发消息点击这里给我发消息
网站栏目导航: 培训课程 手机硬件 手机软件 综合维修 学校资讯 考证指南 就业导航 招生指南 教学管理 入学须知 学校图片 教学大纲 师资力量 学生感言 学校概况 教学实景 手机维修培训资讯 电脑维修培训 维修间故事 手机维修培训 液晶电视维修培训 家电维修资料网 电器维修资料网 招生地区 刷机教程 家电维修 手机技巧 老版网站 招生平台网络工程
友情链接: 监控安装培训 电动工具维修 家电维修学校 电工培训学校 液晶电视维修 焊工培训学校 电工焊工学校 电脑维修学校 家电维修培训 电脑维修培训 家装电工培训网络安装维护 主板维修 液晶显示器 笔记本电脑维修 电脑组装维护 电脑硬件维修 电脑维修 电工考证 电工证 装修电工 水电工 维修电工 电工 焊接技术 电焊工 焊工 电动设备维修 电动工具维修 制冷维修 空调维修 冰箱维修  更多>>
阳光-手机维修教育品牌学校
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校
中山市,固原市,银川市,玉树,海东,陇南市,酒泉市,张掖市,天水市,金昌市,兰州市,榆林市,延安市,渭南市,铜川市,阿里,山南,拉萨市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,毕节,铜仁,遵义市,贵阳市,甘孜州,资阳市,达州市,宜宾市,南充市,遂宁市,绵阳市,泸州市,自贡市,三亚市,崇左市,河池市,玉林市,钦州市,梧州市,柳州市,梅州市,肇庆市,湛江市,佛山市,珠海市,韶关市,湘西州,怀化市,郴州市,张家界市,邵阳市,株洲市,仙桃市,随州市,荆州市,荆门市,襄樊市,黄石市,驻马店市,信阳市,南阳市,漯河市,中卫市,石嘴山市,海西,海南藏州,黄南州,海北,甘南,庆阳市,平凉市,武威市,白银市,嘉峪关市,安康市,汉中市,咸阳市,宝鸡市,林芝,日喀则,昌都,迪庆,德宏,大理,西双版纳,红河州,临沧市,丽江市,保山市,曲靖市,黔东州,黔西州,安顺市,六盘水市,凉山州,阿坝州,雅安市,广安市,眉山市,内江市,广元市,德阳市,攀枝花市,成都市,海口市,来宾市,百色市,贵港市,北海市,桂林市,南宁市,云浮市,揭阳市,潮州市,清远市,阳江市,汕尾市,惠州市,茂名市,江门市,汕头市,深圳市,广州市,娄底市,永州市,益阳市,岳阳市,湘潭市,长沙市,恩施州,黄冈市,孝感市,鄂州市,十堰市,武汉市,周口市,商丘市,三门峡市,许昌市,焦作市,安阳市,鹤壁市,平顶山市,开封市,郑州市,聊城市,滨州市,德州市,莱芜市,日照市,泰安市,烟台市,潍坊市,东营市,淄博市,上饶市,济南市,抚州市,宜春市,赣州市,新余市,九江市,景德镇市,宁德市,南平市,泉州市,莆田市,厦门市,宣城市,亳州市,六安市,宿州市,黄山市,滁州市,安庆市,淮北市,马鞍山市,蚌埠市,芜湖市,合肥市,丽水市,舟山市,衢州市,金华市,湖州市,嘉兴市,宁波市,宿迁市,镇江市,盐城市,连云港市,苏州市,徐州市,南京市,绥化市,牡丹江市,佳木斯市,大庆市,鹤岗市,哈尔滨市,白城市,白山市,辽源市,吉林市,葫芦岛市,铁岭市,盘锦市,阜新市,锦州市,本溪市,鞍山市,沈阳市,锡林郭勒盟,通辽市,乌海市,吕梁市,忻州市,晋中市,晋城市,阳泉市,太原市,廊坊市,承德市,保定市,邯郸市,唐山市,宁夏,甘肃省,西藏,贵州省,重庆市,广西,湖南省,河南省,江西省,安徽省,江苏省,黑龙江省,辽宁省,山西省,天津市,四平市,内蒙古,吴忠市,果洛,西宁市,定西市,商洛市,西安市,那曲,黔南州,巴中市,乐山市,贺州市,防城港市,东莞市,河源市,常德市,衡阳市,咸宁市,宜昌市,濮阳市,新乡市,洛阳市,菏泽市,临沂市,威海市,济宁市,枣庄市,青岛市,吉安市,鹰潭市,萍乡市,南昌市,龙岩市,漳州市,三明市,福州市,池州市,巢湖市,阜阳市,铜陵市,淮南市,台州市,绍兴市,温州市,杭州市,泰州市,扬州市,淮安市,南通市,常州市,无锡市,大兴安岭,黑河市,七台河市,伊春市,双鸭山市,鸡西市,齐齐哈尔市,延边,松原市,通化市,长春市,朝阳市,辽阳市,营口市,丹东市,抚顺市,大连市,阿拉善盟,兴安盟,乌兰察布市,巴彦淖尔市,呼伦贝尔市,鄂尔多斯市,赤峰市,包头市,呼和浩特市,临汾市,运城市,朔州市,长治市,大同市,衡水市,沧州市,张家口市,邢台市,秦皇岛市,石家庄市,青海省,陕西省,云南省,四川省,海南省,广东省,湖北省,山东省,福建省,浙江省,上海市,吉林省,河北省,北京市