找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4892|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32平臺(tái)PWM輸出 ADC轉(zhuǎn)換加12864并行顯示程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:144138 發(fā)表于 2017-8-3 10:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
基于STM32平臺(tái)的ADC轉(zhuǎn)換加4路PWM波輸出并且使用12864顯示,基于德飛萊例程改寫,每一個(gè)功能都單獨(dú)寫的,方便了大家的移植,其中12864使用了PF口,ADC-PC1,PWM-PA6-7,PB0-1。




  1. #include "stm32f10x.h"
  2. #include "delay.h" //必須配合delay.c和delay.h文件使用,所以要包含delay.h。
  3. #include "display12864.h"

  4. #define u16 unsigned short                              //為了可移植性好,對(duì)這兩個(gè) STM 32 已經(jīng)定義過的變量,再定義一次。
  5. #define u8 unsigned char

  6. /********** 以下是相關(guān)引腳定義 **************/
  7. //此次所用IO為:GPIO-F 的 PF 0--7,8,9,10
  8. #define DisIO GPIOF                                     //定義12864要使用的I/O端口。
  9. #define DisClk RCC_APB2Periph_GPIOF                     //定義12864要使用的I/O端口時(shí)鐘。RCC_APB2Periph_GPIOA
  10. #define Data GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
  11.                                                         //定義12864使用的數(shù)據(jù)引腳。
  12. #define RS GPIO_Pin_8                                   //1高電平 data  選擇數(shù)據(jù)  低 無用
  13. #define RW GPIO_Pin_9                                   //高讀低寫
  14. #define EN GPIO_Pin_10                                  //使能信號(hào)   定義使能端使用的引腳。
  15. #define PSB GPIO_Pin_0                                  //定義并,串行數(shù)據(jù)模式的選擇端口使用的引腳。直接高電平,并口;低電平,串口。PC0

  16. /*********定義GPIO結(jié)構(gòu)體 ********************/
  17.                                                             
  18. GPIO_InitTypeDef  GPIOStru;                             //引腳號(hào),速度,模式,定義用于定義所以引腳為輸出的變量。

  19. /****初始化 所有端口 為推挽輸出模式  *********/
  20. void IOInitOut(void)                                    //把 所有端口 初始化為推挽輸出模式的函數(shù)。
  21. {
  22.                 GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;              //引腳模式 定義所有的引腳為推挽輸出的變量初始化。
  23.     GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
  24.                 GPIOStru.GPIO_Pin = PSB;
  25.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  26.                 GPIO_Init(GPIOC,&GPIOStru);                                                                                                        //對(duì)PC口初始化
  27.         
  28.     GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;              //引腳模式 定義所有的引腳為推挽輸出的變量初始化。
  29.     GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;             //時(shí)鐘頻率
  30.     //GPIOStru.GPIO_Pin = Data|RS|RW|EN|PSB;
  31.           GPIOStru.GPIO_Pin = Data|RS|RW|EN;                  //引腳號(hào)

  32.     RCC_APB2PeriphClockCmd(DisClk,ENABLE);              //使能 F引腳 的時(shí)鐘  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
  33.     GPIO_Init(DisIO,&GPIOStru);                                //引腳初始化 庫(kù)函數(shù)  GPIO_Init(GPIOF,&GPIOStru);
  34. }

  35. /****初始化數(shù)據(jù)data引腳為浮空輸入模式  *******/

  36. void IOInitIn(void)                                     //把 數(shù)據(jù)引腳 初始化為浮空輸入的函數(shù)。
  37. {
  38.     GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //定義數(shù)據(jù)引腳為浮空輸入的變量初始化。
  39.     GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
  40.     GPIOStru.GPIO_Pin = Data;                           //只定義數(shù)據(jù)引腳

  41.     RCC_APB2PeriphClockCmd(DisClk,ENABLE);              //把所有端口初始化為輸出模式的函數(shù)。   
  42.     GPIO_Init(DisIO,&GPIOStru);        
  43. }

  44. /****等待12864的忙狀態(tài)結(jié)束 ******************/
  45. void WaitBusy(void)                                     //等待12864的忙狀態(tài)結(jié)束的函數(shù)。
  46. {
  47.     IOInitIn();                                         //把 數(shù)據(jù)引腳 定義為浮空輸入;
  48.     GPIO_ResetBits(DisIO,RS);                           //RS = 0.
  49.     GPIO_SetBits(DisIO,RW);                             //RW = 1.
  50.     GPIO_SetBits(DisIO,EN);                             //EN = 1.
  51.     while(GPIO_ReadInputData(DisIO) & 0x0080);          //只要位7的值,位7是忙標(biāo)志位。0--7 ,如果讀出為1高電平,則表示液晶屏處在忙狀態(tài),當(dāng)轉(zhuǎn)為0時(shí)
  52.     GPIO_ResetBits(DisIO,EN);                           //EN = 0;
  53.     IOInitOut();                                        //把所有引腳定義為輸出。
  54. }

  55. /*********寫命令函數(shù)   *********************/
  56. void WriteCmd(u8 cmd)                                   //寫命令函數(shù)。
  57. {
  58.           WaitBusy();                                         //等待12864忙狀態(tài)結(jié)束
  59.     GPIO_ResetBits(DisIO,RS);                           //RS = 0.
  60.     GPIO_ResetBits(DisIO,RW);                           //RW = 0.
  61.     GPIO_SetBits(DisIO,EN);                             //EN = 1.
  62.     DisIO->ODR=((DisIO->ODR & 0xff00)|cmd);             //此處,只有直接操作寄存器才能
  63.                                                         //達(dá)到,只改變 輸出數(shù)據(jù)寄存器ODR 的低8位,其它位
  64.                                                         //不變的目的。因?yàn),只有?位是數(shù)據(jù)引腳,
  65.                                                         //其它位可能是控制引腳,不能改變。
  66.     delay_ms(2);
  67.     GPIO_ResetBits(DisIO,EN);                           //EN = 0;
  68.     delay_ms(2);         
  69. }

  70. /*********寫數(shù)據(jù)函數(shù)   *********************/
  71. void WriteData(u8 data)                                 //寫數(shù)據(jù)函數(shù)。
  72. {
  73.         WaitBusy();
  74.     GPIO_SetBits(DisIO,RS);                             //RS = 1.
  75.     GPIO_ResetBits(DisIO,RW);                           //RW = 0.
  76.     GPIO_SetBits(DisIO,EN);                             //EN = 1.
  77.     DisIO->ODR=((DisIO->ODR & 0xff00)|data);            //同上。
  78.     delay_ms(2);
  79.     GPIO_ResetBits(DisIO,EN);                           //EN = 0;
  80.     delay_ms(2);
  81. }

  82. /***初始化12864 和要用到的STM32 的GPIO******/
  83. void InitDis(void)                                      //初始化 12864 和要用到的 STM 32 的引腳。
  84. {
  85.     IOInitOut();         
  86.     //delay_init(8);                                    //初始化延時(shí)函數(shù)的微妙計(jì)數(shù)基數(shù)。  
  87.           delay_init();
  88.     GPIO_SetBits(GPIOC,PSB);                          //令PSB=1,設(shè)置為并行數(shù)據(jù)模式。
  89.     delay_ms(2);
  90.     WriteCmd(0x30);                                     //選擇基本指令集,和,8位數(shù)據(jù)模式。
  91.     delay_ms(2);
  92.     WriteCmd(0x0c);                                     //開顯示,無游標(biāo),不反白.
  93.     delay_ms(2);
  94.     WriteCmd(0x01);                                     //清除顯示,并將 DDRAM 的地址計(jì)數(shù)器 AC 設(shè)為 00H.
  95.     delay_ms(2);
  96.     WriteCmd(0x06);                                     //設(shè)置,外部讀寫數(shù)據(jù)后,地址記數(shù)器 AC 會(huì)自動(dòng)加 1。
  97.     delay_ms(2);
  98.     WriteCmd(0x80);                                     //將 DDRAM 地址計(jì)數(shù)器 AC 設(shè)為 0.
  99.     delay_ms(2);        
  100. }

  101. /*********顯示字符串的函數(shù)  ****************/
  102. void DisStr(u8 *s)                                      //顯示字符串的函數(shù)。
  103. {
  104.     while(*s != '\0')
  105.     {
  106.         WriteData(*s);
  107.         s++;
  108.         delay_ms(2);                                    //控制每一個(gè)字符之間顯示的時(shí)間 間隔
  109.     }
  110. }

  111. /*********顯示整型變量的函數(shù)  **************/
  112. void DisInt(long int num)                               //顯示整型變量的函數(shù),最多顯示16位的整數(shù)。只能顯示正數(shù)。
  113. {
  114.         u8 temp[17];
  115.         u8 str[17];
  116.         int i=0,j=0;
  117.         while(num != 0)                                              //這里不能用num%10 != 0,如果num是10的整數(shù)倍,
  118.                                                               //例如,100,這樣就會(huì)出錯(cuò),根本就不能進(jìn)入循環(huán)體。
  119.         {
  120.                 temp[i] = (num%10)+0x30;
  121.                 num/=10;                                            //num 除以 10 = 剩下的樹的整數(shù)  124/10=12
  122.                 i++;
  123.         }
  124.         i--;                                                  //因?yàn)閕在退出循環(huán)之前還自加了一次,此時(shí),
  125.                                                               //指向最后一個(gè)存儲(chǔ)有用值的元素的后一個(gè)位置。
  126.         while(i != -1)                                              //因?yàn)閕=0時(shí),temp[0]還是有用值。
  127.         {
  128.                 str[j] = temp[i];
  129.                 j++;
  130.                 i--;        
  131.         }
  132.         str[j]='\0';                                          //因?yàn)閕在退出循環(huán)之前還自加了一次,此時(shí),
  133.                                                               //指向最后一個(gè)存儲(chǔ)有用值的元素的后一個(gè)位置。
  134.         DisStr(str);        
  135. }

  136. /********顯示有4位小數(shù)的浮點(diǎn)數(shù)  *************/
  137. void DisFloat(float fnum)                               //顯示有4位小數(shù)的浮點(diǎn)數(shù),總位數(shù)不超過16位。
  138. {
  139.         long int num = fnum*10000;
  140.         u8 temp[17];
  141.         u8 str[17];
  142.         int i=0,j=0;
  143.         while(num != 0)                          
  144.         {
  145.                 temp[i] = (num%10)+0x30;
  146.                 num/=10;
  147.                 i++;
  148.                 if(i == 4)                                                //4位小數(shù)處理完后,加入小數(shù)點(diǎn)。
  149.                 {
  150.                         temp[i] = '.';
  151.                         i++;
  152.                 }
  153.         }
  154.         i--;   
  155.         while(i != -1)        
  156.         {
  157.                 str[j] = temp[i];
  158.                 j++;
  159.                 i--;        
  160.         }
  161.         str[j]='\0';  
  162.         DisStr(str);                        
  163. }

  164. /********清全屏函數(shù)  ***********************/
  165. void lcd_clear(void)
  166. {
  167.    WriteCmd(0x01);
  168. }

  169. /********起始顯示位置設(shè)定函數(shù)  **************/
  170. void lcd_locate(u8 X,u8 Y)  
  171. {
  172.         switch(X)
  173.         {
  174.                 case 1: WriteCmd(0x80+Y); break;
  175.                 case 2: WriteCmd(0x90+Y); break;
  176.                 case 3: WriteCmd(0x88+Y); break;
  177.                 case 4: WriteCmd(0x98+Y); break;
  178.         }
  179. }

  180. /********位置顯示字符串函數(shù)  ****************/
  181. void lcd_DisStr(u8 X,u8 Y,u8 *s)
  182. {
  183.    lcd_locate( X, Y);
  184.          DisStr( s );
  185. }









復(fù)制代碼
ADC代碼:

  1. #include "adc.h"
  2. #include "stm32f10x.h  "

  3. #define ADC1_DR_Address    ((u32)0x40012400+0x4c)

  4. __IO uint16_t ADC_ConvertedValue;


  5. /*
  6. * 函數(shù)名:ADC1_GPIO_Config
  7. * 描述  :使能ADC1和DMA1的時(shí)鐘,初始化PC.01
  8. * 輸入  : 無
  9. * 輸出  :無
  10. * 調(diào)用  :內(nèi)部調(diào)用
  11. */
  12. static void ADC1_GPIO_Config(void)
  13. {
  14.         ADC_InitTypeDef ADC_InitStructure;
  15.         GPIO_InitTypeDef GPIO_InitStructure;
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1        , ENABLE );
  17.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  18.         
  19.         /* Enable DMA clock */
  20.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  21.         
  22.         /* Enable ADC1 and GPIOC clock */
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  24.         
  25.         /* Configure PC.01  as analog input */
  26.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  28.         GPIO_Init(GPIOC, &GPIO_InitStructure);                                // PC1,輸入時(shí)不用設(shè)置速率
  29. }


  30. /* 函數(shù)名:ADC1_Mode_Config
  31. * 描述  :配置ADC1的工作模式為MDA模式
  32. * 輸入  : 無
  33. * 輸出  :無
  34. * 調(diào)用  :內(nèi)部調(diào)用
  35. */
  36. static void ADC1_Mode_Config(void)
  37. {
  38.         DMA_InitTypeDef DMA_InitStructure;
  39.         ADC_InitTypeDef ADC_InitStructure;
  40.         
  41.         /* DMA channel1 configuration */
  42.         DMA_DeInit(DMA1_Channel1);
  43.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //ADC地址
  44.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//內(nèi)存地址
  45.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  46.         DMA_InitStructure.DMA_BufferSize = 1;
  47.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址固定
  48.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;  //內(nèi)存地址固定
  49.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        //半字
  50.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  51.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //循環(huán)傳輸
  52.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  53.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  54.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  55.         
  56.         /* Enable DMA channel1 */
  57.         DMA_Cmd(DMA1_Channel1, ENABLE);
  58.         
  59.         /* ADC1 configuration */
  60.         
  61.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //獨(dú)立ADC模式
  62.         ADC_InitStructure.ADC_ScanConvMode = DISABLE ;          //禁止掃描模式,掃描模式用于多通道采集
  63.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //開啟連續(xù)轉(zhuǎn)換模式,即不停地進(jìn)行ADC轉(zhuǎn)換
  64.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //不使用外部觸發(fā)轉(zhuǎn)換
  65.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //采集數(shù)據(jù)右對(duì)齊
  66.         ADC_InitStructure.ADC_NbrOfChannel = 1;                 //要轉(zhuǎn)換的通道數(shù)目1
  67.         ADC_Init(ADC1, &ADC_InitStructure);
  68.         
  69.         /*配置ADC時(shí)鐘,為PCLK2的8分頻,即9Hz*/
  70.         RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  71.         /*配置ADC1的通道11為55.        5個(gè)采樣周期,序列為1 */
  72.         ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
  73.         
  74.         /* Enable ADC1 DMA */
  75.         ADC_DMACmd(ADC1, ENABLE);
  76.         
  77.         /* Enable ADC1 */
  78.         ADC_Cmd(ADC1, ENABLE);
  79.         
  80.         /*復(fù)位校準(zhǔn)寄存器 */   
  81.         ADC_ResetCalibration(ADC1);
  82.         /*等待校準(zhǔn)寄存器復(fù)位完成 */
  83.         while(ADC_GetResetCalibrationStatus(ADC1));
  84.         
  85.         /* ADC校準(zhǔn) */
  86.         ADC_StartCalibration(ADC1);
  87.         /* 等待校準(zhǔn)完成*/
  88.         while(ADC_GetCalibrationStatus(ADC1));
  89.         
  90.         /* 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換 */
  91.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  92. }

  93. /*
  94. * 函數(shù)名:ADC1_Init
  95. * 描述  :無
  96. * 輸入  :無
  97. * 輸出  :無
  98. * 調(diào)用  :外部調(diào)用
  99. */
  100. void ADC1_Init(void)
  101. {
  102.         ADC1_GPIO_Config();
  103.         ADC1_Mode_Config();
  104. }
復(fù)制代碼
PWM輸出代碼:

  1. #include "PWM_output.h"
  2. #define ARR 4000  //表示分頻后得到的頻率,為8MHZ除以ARR

  3. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4. TIM_OCInitTypeDef  TIM_OCInitStructure;
  5. // uint16_t CCR1_Val = 4000;                                // (4000 / 8000) * 100% = 50%
  6. // uint16_t CCR2_Val = 3000;                                // (3000 / 8000) * 100% = 37.5%
  7. // uint16_t CCR3_Val = 2000;                                // (2000 / 8000) * 100% = 25%
  8. // uint16_t CCR4_Val = 1000;                                // (1000 / 8000) * 100% = 12.5%

  9. uint16_t CCR1_Val = ARR/2;                                // (4000 / 8000) * 100% = 50%
  10. uint16_t CCR2_Val = ARR/8*3;                                // (3000 / 8000) * 100% = 37.5%
  11. uint16_t CCR3_Val = ARR/4;                                // (2000 / 8000) * 100% = 25%
  12. uint16_t CCR4_Val = ARR/8;                                // (1000 / 8000) * 100% = 12.5%
  13. uint16_t PrescalerValue = 0;


  14. void RCC_Configuration(void);
  15. void GPIO_Configuration(void);


  16. /*******************************************************************************
  17. * 函數(shù)名  : RCC_Configuration
  18. * 描述    : RCC時(shí)鐘配置函數(shù)
  19. * 輸入    : 無
  20. * 輸出    : 無
  21. * 返回值  : 無
  22. * 注意    : 無
  23. *******************************************************************************/
  24. void RCC_Configuration(void)
  25. {
  26.   /* TIM3 時(shí)鐘使能 */
  27.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  28.   /* GPIOA 與 GPIOB 時(shí)鐘使能 */   //其為TIM3的4個(gè)通道
  29.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  30. //         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  31. }



  32. /*******************************************************************************
  33. * 函數(shù)名  : GPIO_Configuration
  34. * 描述    : 管腳配置
  35. * 輸入    : 無
  36. * 輸出    : 無
  37. * 返回值  : 無
  38. * 注意    : 無
  39. *******************************************************************************/
  40. void GPIO_Configuration(void)
  41. {
  42.   GPIO_InitTypeDef GPIO_InitStructure;

  43.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  44.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
  45. //         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //開漏輸出
  46.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  47.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  48.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  49.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  50. }


  51. /*******************************************************************************
  52. * 函數(shù)名  : PWM_Output_Init
  53. * 描述    : PWM輸出初始化函數(shù)
  54. * 輸入    : 無
  55. * 輸出    : 無
  56. * 返回值  : 無
  57. * 注意    : 無
  58. *******************************************************************************/
  59. void PWM_Output_Init(void)
  60. {
  61.           /* 時(shí)鐘配置 */
  62.   RCC_Configuration();

  63.   /* 管腳配置 */
  64.   GPIO_Configuration();

  65.   /* -----------------------------------------------------------------------
  66.     TIM3 配置: 輸出 4 通道的 PWM 信號(hào):
  67.     TIM3 預(yù)分頻系數(shù)計(jì)算:
  68.      - Prescaler = (系統(tǒng)時(shí)鐘 / TIM3 計(jì)數(shù)時(shí)鐘) - 1
  69.     默認(rèn)使能的系統(tǒng)時(shí)鐘為 72MHz

  70.     TIM3 產(chǎn)生的頻率為 36KHz: TIM3 Frequency = TIM3 計(jì)數(shù)時(shí)鐘/(ARR + 1)
  71.                                                   = 8 MHz / 8000 = 1 KHz
  72.     TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
  73.     TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
  74.     TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
  75.     TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  76.   ----------------------------------------------------------------------- */
  77.   /* 預(yù)分頻值計(jì)算 */
  78.   PrescalerValue = (uint16_t) (SystemCoreClock / 8000000) - 1;                        //TIM3的預(yù)分頻系數(shù)  (72M / 8M) - 1 = 8  即為 9 分頻,即為8M的頻率
  79.   /* 定時(shí)器配置 */
  80.   //TIM_TimeBaseStructure.TIM_Period = (8000 - 1);                                                                                //ARR值,定時(shí)器時(shí)鐘頻率 / (ARR + 1) -- 為PWM的輸出頻率值
  81.         TIM_TimeBaseStructure.TIM_Period = (ARR-1);
  82.   TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;                                                        //預(yù)分頻
  83.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  84.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                                //計(jì)數(shù)方式為向上計(jì)數(shù)

  85.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                                                                //初始TIM3

  86.   /* 通道1配置 */
  87.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                                        //PWM模式1
  88.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能輸出
  89.   TIM_OCInitStructure.TIM_Pulse = CCR1_Val;                                                                                                        //(CCR1_Val / ARR值 ) * 100 為占空比值
  90.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                        //輸出高

  91.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  92.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);                                                                        //重裝載使能

  93.   /* 通道2配置 */
  94.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  95.   TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  96.   TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  97.   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  98.   /* 通道3配置 */
  99.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  100.   TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  101.   TIM_OC3Init(TIM3, &TIM_OCInitStructure);

  102.   TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  103.   /* 通道4配置 */
  104.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  105.   TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  106.   TIM_OC4Init(TIM3, &TIM_OCInitStructure);

  107.   TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  108.   TIM_ARRPreloadConfig(TIM3, ENABLE);

  109.   /* TIM3 使能計(jì)數(shù) */
  110.   TIM_Cmd(TIM3, ENABLE);

  111. }
復(fù)制代碼

全部資料下載地址:
整體程序.zip (1.97 MB, 下載次數(shù): 91)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:713781 發(fā)表于 2020-4-15 13:47 | 只看該作者
樓主想要仿真電路
回復(fù)

使用道具 舉報(bào)

板凳
ID:713781 發(fā)表于 2020-4-15 14:05 | 只看該作者
想要仿真電路
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表