STM32产生SPWM

[cpp]  view plain copy
  1. /** @author Mei Jilin 
  2.     @date   2013/9/2 
  3.     @brief  加入生成SPWM部分 
  4. **/  
  5. #include "timer.h"  
  6. #include "led.h"  
  7. static uint16_t CCR3_Val = 1800;  
  8. static uint16_t PrescalerValue = 0;  
  9.   
  10. /*PWM输出配置说明,*/  
  11. /* - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 选择TIMER工作在36MHZ 
  12.  
  13.     The TIM3 is running at 36 MHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1) 
  14.                                                   = 36 MHz / 3600 = 10 KHz 
  15.     TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 */  
  16.     /*转换周期10K*/  
  17. void PWM_Init(void)  
  18. {  
  19.     TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;  
  20.     TIM_OCInitTypeDef           TIM_OCInitStructure;  
  21.     GPIO_InitTypeDef            GPIO_InitStructure;  
  22.     NVIC_InitTypeDef NVIC_InitStructure;      
  23.         /* TIM3 clock enable */  
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  
  25.   
  26.     /* GPIOA and GPIOB clock enable */  
  27.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|  
  28.                              RCC_APB2Periph_AFIO, ENABLE);  
  29.     /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */  
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  
  31.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  32.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  33.     GPIO_Init(GPIOA, &GPIO_InitStructure);  
  34.       
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;      //TIM1_CH1N  
  36.     GPIO_Init(GPIOB, &GPIO_InitStructure);  
  37.       
  38.      /* Compute the prescaler value */  
  39.     PrescalerValue = (uint16_t) (SystemCoreClock / 36000000) - 1; //TIMER2 - 36MHZ  
  40.     /* Time base configuration */  
  41.     TIM_TimeBaseStructure.TIM_Period = 3600;                    /*TIM3_ARR = 2879,12.5Khz*/  
  42.     TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;  
  43.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  44.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  45.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  
  46.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  
  47.   
  48.     /* Channel 1, 2,3 and 4 Configuration in PWM mode */  
  49.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
  50.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  51.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //关闭互补输出  
  52.     TIM_OCInitStructure.TIM_Pulse = CCR3_Val;  
  53.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
  54.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;  
  55.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;  
  56.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;  
  57.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
  58.       
  59.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //这句的功能是让改变CCR2之后马上有效      
  60.     TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);  
  61.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
  62.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  
  63.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  64.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;  
  65.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  66.     NVIC_Init(&NVIC_InitStructure);      
  67.           
  68.     TIM_Cmd(TIM1, ENABLE);    
  69.     /* TIM1 Main Output Enable */  
  70.     TIM_CtrlPWMOutputs(TIM1, ENABLE);   //TIM1需要加上这句,貌似低级定时器不需要  
  71. }  
  72. uint16_t Duty[] = {1800,1856,1912,1968,2023,2078,2131,2183,2233,2282,2329,2373,2416,2456,2493,  
  73.     2528,2559,2588,2614,2636,2655,2671,2684,2692,2698,2699,2698,2692,2684,2671,2655,2636,2614,  
  74.     2588,2559,2528,2493,2456,2416,2373,2329,2282,2233,2183,2131,2078,2023,1968,1912,1856,1800,  
  75.     1743,1687,1631,1576,1521,1468,1416,1366,1317,1270,1226,1183,1143,1106,1071,1040,1011,985,  
  76.     963,944,928,915,907,901,900,901,907,915,928,944,963,985,1011,1040,1071,1106,1143,1183,1226,  
  77.     1270,1317,1366,1416,1468,1521,1576,1631,1687,1743,1799,1799};  
  78. uint16_t count = 0;  
  79. uint16_t num = sizeof(Duty)/(sizeof(Duty[0]));  
  80. void TIM1_CC_IRQHandler(void)  
  81. {  
  82.   if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)  
  83.   {  
  84.     TIM1->SR = (uint16_t)~TIM_IT_CC1;  
  85.     TIM1->CCR1 = Duty[count];  
  86.     count++;  
  87.     if(count==num)  
  88.     {  
  89.         count=0;  
  90.     }  
  91.   }  
  92. }  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要下载STM32实现SPWM(Sinusoidal Pulse Width Modulation)的源码,您可以按照以下步骤进行操作: 1. 打开您的浏览器,进入STM32官方网站(www.st.com)。 2. 在官方网站的搜索框中输入您的STM32型号,例如"STM32F103C8T6"。 3. 进入搜索结果页面后,点击选中您所需的型号。 4. 在该型号的页面上,找到并点击 "技术文档" 或者 "文档和软件" 分页。 5. 在 "文档和软件" 页中,您可以找到“固件”或“软件库”部分,这些是常用的源码资源。 6. 在该部分中,查找并下载您需要的源码文件。可以选择完整的项目源码或者特定功能实现的源码。 7. 将下载好的源码文件解压缩到您的电脑目录中。 8. 确保您的电脑上已安装STM32相关的开发环境,例如Keil、IAR或CubeMX等。 9. 打开所选的开发环境,导入或打开解压缩后的源码文件。 10. 根据您的需求和具体的项目配置,对SPWM源码进行修改和调试。 11. 在开发环境中编译源码,生成可执行程序文件。 12. 将可执行程序文件下载到您的STM32开发板中,可以使用ST-LINK、JTAG等下载工具。 13. 确保STM32开发板连接到电源,并进行相应的硬件接线,以实现SPWM的功能。 14. 在开发板上执行程序,验证SPWM的实现。 通过以上步骤,您可以下载STM32 SPWM的源码,并在开发板上实现相应的功能。但请注意,源码的具体实现可能因不同的STM32型号和开发环境而有所差异,您需要根据自己的情况进行相应的适配和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值