找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2592|回复: 1
收起左侧

STM32 TIM8 6路互补三相SPWM波形输出 源程序

[复制链接]
ID:782771 发表于 2020-6-18 11:20 | 显示全部楼层 |阅读模式
这是我之前写的STM32的SPWM波形程序,使用TIM8的三对互补端口进行波形产生。

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "SysTickDelay.h"
  3. #include "misc.h"
  4. #include "remote.h"

  5. u32 Remote_Odr=0; //命令暂存
  6. u8 Remote_Cnt=0;  //按键按下次数
  7. u8 Remote_Rdy=0;  //红外接收到数据

  8. /*****红外键盘初始化****/
  9. void Remote_Init(void)          //初始化
  10. {          
  11.           GPIO_InitTypeDef   GPIO_InitStructure;
  12.           EXTI_InitTypeDef   EXTI_InitStructure;
  13.           NVIC_InitTypeDef   NVIC_InitStructure;

  14.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; //选择引脚2
  15.       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
  16.       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //输出频率最大50MHz
  17.       GPIO_Init(GPIOC,&GPIO_InitStructure);

  18.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource10);  //配置中断线路PC.2

  19.           EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  20.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  21.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  22.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //使能中断
  23.           EXTI_Init(&EXTI_InitStructure);
  24.                    
  25.             NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //中断向量组2

  26.       NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel ;
  27.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
  28.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                  //响应优先级0
  29.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  30.       NVIC_Init(&NVIC_InitStructure);
  31. }
  32. /**********检测脉冲宽度**************************************/
  33. /**********最长脉宽5ms***************************************/
  34. /**********返回值:x,代表x*20us*****************************/
  35. u8 Pulse_Width_Check(void)
  36. {
  37.         u8 t=0;
  38.         while(RDATA)
  39.         {
  40.                 t++;delay_us(20);
  41.                 if(t==250)return t;
  42.         }
  43.         return t;
  44. }
  45. /********中断处理程序*******************************/
  46. void EXTI15_10_IRQHandler(void)
  47. {
  48.         u8 res=0;
  49.         u8 OK=0;
  50.         u8 RODATA=0;
  51.         while(1)
  52.         {
  53.                 if(RDATA)
  54.                         {
  55.                         res=Pulse_Width_Check();
  56.                         if(res==250)break;
  57.                         if(res>=200&&res<=250)OK=1;
  58.                         else if(res>=85&&res<=200)
  59.                                 {
  60.                                 Remote_Rdy=1;
  61.                                 Remote_Cnt++;
  62.                                 break;
  63.                                 }
  64.                         else if(res>=50&&res<=85)RODATA=1;
  65.                         else if(res>=10&&res<=50)RODATA=0;
  66.                         if(OK)
  67.                                 {
  68.                                 Remote_Odr<<=1;
  69.                                 Remote_Odr+=RODATA;
  70.                                 Remote_Cnt=0;
  71.                                 }
  72.                         }
  73.         }
  74.         EXTI_ClearFlag(EXTI_Line10);
  75. }
  76. /********处理键盘*******************************/
  77. /********返回相应键值*******************************/
  78. u8 Remote_Process(void)
  79. {
  80.         u8 t1,t2;
  81.         t1=Remote_Odr>>8;
  82.         t2=Remote_Odr;
  83.         Remote_Rdy=0;
  84.         if(t1!=(u8)~t2)return 'N';
  85.          switch(t1)
  86.                                  {                                                           // 显示遥控上的字符按键
  87.                             case 162: return 'M';  
  88.                                 case 98:  return 'U';  
  89.                                 case 226: return'B';   
  90.                                 case 34:  return'L';  
  91.                                 case 2:   return'O';   
  92.                                 case 194: return'R';  
  93.                                 case 224: return'*';   
  94.                                 case 168: return'D';   
  95.                             case 144: return'#';   
  96.                                 case 104: return 0;   
  97. ……………………

  98. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SPWM - TIM8三相六路输出.7z (244.89 KB, 下载次数: 96)
回复

使用道具 举报

ID:1 发表于 2020-6-18 15:11 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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