找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2221|回复: 1
打印 上一主题 下一主题
收起左侧

stm32多路PWM模拟输出的程序源码

[复制链接]
跳转到指定楼层
楼主
ID:337869 发表于 2018-5-25 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32F103c8t6的程序(可方便改成使用的单片机),通过定时器模拟输出多路脉冲宽度不同的PWM,且脉冲宽度与脉冲宽度改变速度可控。自己用于多路舵机驱动,理论上单片机有多少I/O口就能输出多少路PWM!!!

stm32单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "TIM.h"
  3. #include "DELAY.h"
  4. #include "GPIO.h"
  5. #include "math.h"
  6. #include "DATA.h"

  7. int main()
  8. {
  9. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//选择中断分组4
  10. GPIO_Configuration();

  11. TIM3_Init(71,9);//每10us进一次中断
  12. NVIC3_Configurature();
  13. TIM2_Init(35999,19);//100Hz
  14. NVIC2_Configurature();
  15.        
  16.         slaver_SetAngle(0,220,60);//零号舵机,A1
  17.         slaver_SetAngle(1,20,60);//A2
  18.         slaver_SetAngle(2,40,60);//A3
  19.         slaver_SetAngle(3,60,60);
  20.         slaver_SetAngle(4,80,60);
  21.         slaver_SetAngle(5,100,60);
  22.         slaver_SetAngle(6,120,60);
  23.         slaver_SetAngle(8,140,60);
  24.         slaver_SetAngle(9,160,60);
  25.         slaver_SetAngle(10,170,60);
  26.         slaver_SetAngle(11,100,60);
  27.         slaver_SetAngle(12,40,60);
  28.         slaver_SetAngle(13,60,60);
  29.         slaver_SetAngle(14,70,60);
  30.         slaver_SetAngle(15,80,60);
  31.         slaver_SetAngle(16,90,60);
  32.         slaver_SetAngle(17,100,60);
  33.         while(1)
  34.         {
  35.         }
  36. }
  37.        
  38. volatile unsigned short pulse_width = 2000;
  39. volatile unsigned int tim3_cnt = 0;//设置的奇数位
  40.        
  41. void TIM3_IRQHandler(void)//TIM3做PWM输出
  42. {
  43.         unsigned char j;
  44.         TIM3->SR = 0;//清楚中断
  45.        
  46.         tim3_cnt++;
  47.         if(tim3_cnt == pulse_width)
  48.         {
  49.                 tim3_cnt = 0;
  50.                 GPIOA->ODR |= 0XFFFF;//对其他的端口不会影响
  51.                 GPIOB->ODR |= 0XFFFF;
  52.         }
  53.         for(j = 0;j < slave_Number;j ++)
  54.         {
  55.                 if(tim3_cnt == slaver_data[j].Data_Converted)//等于角度转换值得到的数值
  56.                 {
  57.                                 (slaver_data[j].GPIOx)->ODR&=~slaver_data[j].GPIO_Pin;//选择端口,进行赋值
  58.                 }
  59.         }
  60. }       

  61. void TIM2_IRQHandler(void)//定时器2做控速
  62. {
  63.         unsigned char i;
  64.         TIM2->SR = 0;
  65.   
  66.         for(i=0; i<slave_Number; i++)
  67.         {
  68.                 if(fabs(slaver_data[i].Data_Desire - slaver_data[i].Data_Real) < slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE)//判断实际角度与输入角度的差值
  69.                 {
  70.                         slaver_data[i].Data_Real = slaver_data[i].Data_Desire;//差值小就直接赋值
  71.                 }
  72.                 else
  73.                 {
  74.                         if(slaver_data[i].Data_Desire > slaver_data[i].Data_Real)//输入值大于实际值
  75.                         {
  76.                                 slaver_data[i].Data_Real += slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE;//加等于输入值
  77.                         }
  78.                         else
  79.                         {
  80.                                 slaver_data[i].Data_Real -= slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE;//减等于输入值
  81.                         }
  82.                 }
  83.                 slaver_data[i].Data_Converted = (unsigned short)(50.0f + slaver_data[i].Data_Real*SLAVER_CHANGE);//加上偏移量,转换数值
  84.         }
  85. }
复制代码

所有资料51hei提供下载:
duoji-qudong-5.zip (318.85 KB, 下载次数: 33)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:337869 发表于 2018-5-25 10:17 | 只看该作者
我怎么上传资料啊,刚来这个论坛,尴尬,,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表