[技术贴] 【M0】 MG32F02A 学习笔记⑯ PWM触发ADC

[复制链接]
128|1
 楼主 | 2018-10-23 09:45 | 显示全部楼层 |阅读模式
     上回我们说到了MG32F02A的BOD唤醒的使用。帖子详情:http://bbs.21ic.com/icview-2571922-1-1.html

      想了一下,我已经讲过了PWM,ADC,那么,那我可以尝试一下PWM触发ADC采样呀,好像这东西可以用来驱动直流无刷电机,虽然具体怎么驱动我也不是很了解。
      代码比较长,我放在二楼
 楼主 | 2018-10-23 09:45 | 显示全部楼层



  1. #include "MG32x02z_DRV.H"
  2. #include <stdio.h>

  3. typedef uint8_t u8;
  4. typedef uint16_t u16;
  5. typedef uint32_t u32;
  6. typedef uint64_t u64;

  7. #define TM36_PrescalerCounter_Range 120
  8. #define TM36_MainCounter_Range      1000
  9. #define URTX URT0

  10. uint8_t RcvBuf[20] __attribute__((at(0x20003800)));


  11. //if user wants to delay 1ms and CK_TM00_PR is 12MHz.
  12. //The Total clocks is 12M*1ms = 12000.
  13. //User can set "clock prescaler"=100 and "pulse width"=120 .   


  14. void Sample_TM36_PWM(void)
  15. {  
  16.     TM_TimeBaseInitTypeDef TM_TimeBase_InitStruct;
  17.    
  18.                 //        The period = (prescaler*main counter)/12MHz (CK_TM36_PR=12MHz) (s)
  19.     //  User can update duty cycle by replace CCxB register.
  20.          
  21.     TM_DeInit(TM36);
  22.    
  23.     // ----------------------------------------------------
  24.     // 1.TimeBase structure initial
  25.     TM_TimeBaseStruct_Init(&TM_TimeBase_InitStruct);
  26.    
  27.     // modify parameter
  28.     TM_TimeBase_InitStruct.TM_MainClockDirection =TM_UpCount;
  29.     TM_TimeBase_InitStruct.TM_Period = TM36_MainCounter_Range-1;
  30.     TM_TimeBase_InitStruct.TM_Prescaler = TM36_PrescalerCounter_Range-1;
  31.     TM_TimeBase_InitStruct.TM_CounterMode =Cascade;
  32.    
  33.     TM_TimeBase_Init(TM36, &TM_TimeBase_InitStruct);
  34.    
  35.     // ----------------------------------------------------
  36.     // 2.config TM36 channel 1 function
  37.     TM_CH1Function_Config(TM36, TM_16bitPWM);

  38.    
  39.     // ----------------------------------------------------
  40.     // 3.Enable TM36 channel 1 Output (just output TM36_OC10)
  41.     TM_OC10Output_Cmd(TM36,ENABLE);   
  42.     TM_InverseOC1z_Cmd(TM36, DISABLE);
  43.     TM_OC1zOutputState_Init(TM36, CLR);
  44.    
  45.                 TM_OC1NOutput_Cmd(TM36, ENABLE);
  46.     TM_InverseOC1N_Cmd(TM36, DISABLE);
  47.                
  48.     // ----------------------------------------------------
  49.                 // 4.set trigger output source
  50.                 TM_TRGO_Select(TM36, TRGO_OS1);
  51.                
  52.     // ----------------------------------------------------
  53.     // 5.set match point (Duty cycle %) for PWM channel0.Less value of CCnA/CCnB,more lighten (1~65536)
  54.                
  55.     TM_SetCC1A(TM36,500);        
  56.     TM_SetCC1B(TM36,500);                // reload value when overflow

  57.     // ----------------------------------------------------
  58.     // 6.select Edge Align
  59.     TM_AlignmentMode_Select(TM36, TM_CenterAlign);
  60.    
  61.     // ----------------------------------------------------
  62.     // 7.clear flag
  63.     TM_ClearFlag(TM36, TMx_CF0A | TMx_CF1A | TMx_CF2A);
  64.    
  65.     // ----------------------------------------------------
  66.     // 8.Timer enable
  67.     TM_Timer_Cmd(TM36,ENABLE);
  68. }

  69. void Sample_URT0_Init(void)
  70. {
  71.     URT_BRG_TypeDef  URT_BRG;
  72.     URT_Data_TypeDef DataDef;
  73.             PIN_InitTypeDef PINX_InitStruct;
  74.     //==Set CSC init
  75.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  76.     //Select CK_HS source = CK_IHRCO
  77.     //Select IHRCO = 11.0592M
  78.     //Select CK_MAIN Source = CK_HS
  79.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  80.     //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
  81.     //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
  82.    
  83.     //==Set GPIO init
  84.     //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8/9
  85.     //GPIO port initial is 0xFFFF
  86.     //Pin8 mode is PPO/Pin9 mode is ODO
  87.     //Pin8/9 pull-up resister Enable
  88.     //Pin8/9 function URT0_TX/RX
  89.   PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
  90.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  91.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  92.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  93.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  94.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
  95.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_TX
  96.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD at PB8

  97.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
  98.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_RX
  99.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD at PB9  
  100.        
  101.        
  102.    
  103.     //=====Set Clock=====//
  104.     //---Set BaudRate---//
  105.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
  106.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
  107.     URT_BRG.URT_PrescalerCounterReload = 0;                        //Set PSR
  108.     URT_BRG.URT_BaudRateCounterReload = 3;                        //Set RLR
  109.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                    //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
  110.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                    //Enable BaudRateGenerator
  111.     //---TX/RX Clock---//
  112.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);        //URT_TX use BaudRateGenerator
  113.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);        //URT_RX use BaudRateGenerator
  114.     URT_TXOverSamplingSampleNumber_Select(URTX, 25);                //Set TX OS_NUM
  115.     URT_RXOverSamplingSampleNumber_Select(URTX, 25);                //Set RX OS_NUM
  116.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
  117.     URT_TX_Cmd(URTX, ENABLE);                                    //Enable TX
  118.     URT_RX_Cmd(URTX, ENABLE);                                    //Enable RX
  119.    
  120.    

  121.     //=====Set Mode=====//
  122.     //---Set Data character config---//
  123.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
  124.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
  125.     DataDef.URT_TX_DataOrder   = URT_DataTyped_LSB;
  126.     DataDef.URT_RX_DataOrder   = URT_DataTyped_LSB;
  127.     DataDef.URT_TX_Parity      = URT_Parity_No;
  128.     DataDef.URT_RX_Parity      = URT_Parity_No;
  129.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
  130.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
  131.     DataDef.URT_RX_DataInverse = DISABLE;
  132.     DataDef.URT_RX_DataInverse = DISABLE;
  133.     URT_DataCharacter_Config(URTX, &DataDef);
  134.     //---Set Mode Select---//
  135.     URT_Mode_Select(URTX, URT_URT_mode);
  136.     //---Set DataLine Select---//
  137.     URT_DataLine_Select(URTX, URT_DataLine_2);
  138.    
  139.     //=====Set Error Control=====//
  140.     // to do...
  141.    
  142.     //=====Set Bus Status Detect Control=====//
  143.     // to do...
  144.    
  145.     //=====Set Data Control=====//
  146.     URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
  147.     URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
  148.     URT_TXGaudTime_Select(URTX, 0);
  149.    
  150.     //=====Enable URT Interrupt=====//
  151. //   URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
  152.   //  URT_ITEA_Cmd(URTX, ENABLE);
  153.   //  NVIC_EnableIRQ(URT0_IRQn);
  154.                
  155.     //=====Enable URT=====//
  156.     URT_Cmd(URTX, ENABLE);
  157.                
  158.         //==See MG32x02z_URT0_IRQ.c when interrupt in
  159. }

  160. int fputc(int ch,FILE *f)
  161. {
  162.        
  163.         URT_SetTXData(URTX,1,ch);
  164.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  165.         URT_ClearITFlag(URTX,URT_IT_TC);
  166.        
  167.         return ch;
  168. }

  169. void UartSendByte(int ch)
  170. {
  171.        
  172.         URT_SetTXData(URTX,1,ch);
  173.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  174.         URT_ClearITFlag(URTX,URT_IT_TC);
  175.        
  176. }

  177. void ADC_Init(void)
  178. {
  179.         ADC_InitTypeDef ADC_Base;
  180.    
  181.    
  182.     // make sure :
  183.        
  184.     //===Set CSC init====
  185.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  186.     //Select CK_HS source = CK_IHRCO
  187.     //Select IHRCO = 12M
  188.     //Select CK_MAIN Source = CK_HS
  189.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  190.     //Configure Peripheral On Mode Clock->ADC = Enable
  191.     //Configure Peripheral On Mode Clock->Port A = Enable
  192.        
  193.     //==Set GPIO init
  194.     //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOA->Pin4
  195.     //GPIO port initial is 0xFFFF
  196.     //Pin4 mode is AIO
  197.     //Pin4 function GPA4

  198.     ADC_DeInit(ADC0);
  199.     // ------------------------------------------------------------------------
  200.     // 1.Config ADC base parameter   
  201.     ADC_BaseStructure_Init(&ADC_Base);
  202.        // modify parameter
  203.     ADC_Base.ADCMainClockSelect = ADC_CKADC;
  204.     ADC_Base.ADC_IntCK_Div = ADC_IntDIV16;   // for internal clock divider
  205.    
  206.         // ADC data alignment mode (Right or Left)
  207.     ADC_Base.ADC_DataAlign = ADC_RightJustified;
  208.         
  209.         // ADC conversion resolution 8, 10 or 12 bit
  210.     ADC_Base.ADC_ResolutionSel = ADC_12BitData;
  211.         
  212.         // ADC overwritten data or keep data
  213.     ADC_Base.ADC_DataOverrunEvent = ADC_DataOverWritten;
  214.         
  215.    
  216.     ADC_Base_Init(ADC0, &ADC_Base);
  217.    
  218.     // ------------------------------------------------------------------------
  219.         // 2.Enable ADC
  220.     ADC_Cmd(ADC0, ENABLE);
  221.    
  222.     // ------------------------------------------------------------------------
  223.     // 3.Config ADC Mode
  224.     ADC_ConversionMode_Select(ADC0, ADCMode);   // one-shot
  225.     ADC_PGA_Cmd(ADC0, DISABLE);                 // Disable PGA
  226.     ADC_SingleDifferentMode_Select(ADC0, ADC_SingleMode);  // Single Mode  
  227.    
  228.     // ------------------------------------------------------------------------
  229.     // 4.Clear all flag
  230.     ADC_ClearFlag(ADC0, 0xFFFFFFFF);

  231.     // ------------------------------------------------------------------------
  232.     // 5.Start Calibration
  233.    
  234.                 ADC_StartCalibration(ADC0, ENABLE);
  235.                 // 6.Select Exnternal Channel (PA4)
  236.     ADC_ExternalChannel_Select(ADC0, ADC_ExtAIN4);
  237.         //        ADC_InternalChannel_Select(ADC0, ADC_INT_IVREF);
  238.         //        ADC_ExternalChannel_Select(ADC0, ADC_ExtAIN4);

  239.     // ------------------------------------------------------------------------
  240.         // 7.Trigger Source select and Start conversion
  241.     ADC_TriggerSource_Select(ADC0, ADC_TM36_TRGO);
  242.                 ADC_TriggerEdge_Select(ADC0, ADC_AcceptFallingEdge);
  243.                
  244.                
  245. }

  246. void CSC_Init (void)
  247. {
  248.         CSC_PLL_TyprDef CSC_PLL_CFG;
  249.        
  250.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  251.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  252.   ProtectModuleReg(MEMprotect);

  253.   UnProtectModuleReg(CSCprotect);
  254.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  255.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  256.        
  257.         /* CK_HS selection */
  258.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  259.         CSC_IHRCO_Cmd(ENABLE);
  260.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  261.         CSC_ClearFlag(CSC_IHRCOF);
  262.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO
  263.        
  264.         /* PLL */
  265.         /**********************************************************/
  266.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  267.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  268.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  269.         CSC_PLL_Config(&CSC_PLL_CFG);
  270.         CSC_PLL_Cmd(ENABLE);
  271.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  272.         CSC_ClearFlag(CSC_PLLF);
  273.         /**********************************************************/

  274.        
  275.         /* CK_MAIN */
  276.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  277.         /* Configure ICKO function */
  278.                
  279.         /* Configure peripheral clock */
  280.         CSC_PeriphOnModeClock_Config(CSC_ON_PortA,ENABLE);                                          // Enable Port A clock
  281.         CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);                                          // Enable Port B clock
  282.         CSC_PeriphOnModeClock_Config(CSC_ON_PortC,ENABLE);                                          // Enable Port C clock
  283.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);                                          // Enable Port D clock
  284.        
  285.         CSC_PeriphProcessClockSource_Config(CSC_TM36_CKS, CK_APB);
  286.         CSC_PeriphOnModeClock_Config(CSC_ON_TM36, ENABLE);                                          // Enable TIM36 module clock
  287.        
  288.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  289.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0, ENABLE);                                          // Enable UART0 module clock
  290.        
  291.         CSC_PeriphProcessClockSource_Config(CSC_ADC0_CKS, CK_APB);
  292.         CSC_PeriphOnModeClock_Config(CSC_ON_ADC0, ENABLE);                                          // Enable ADC0 module clock       
  293.        
  294.         CSC_PeriphOnModeClock_Config(CSC_ON_DMA,ENABLE);

  295.   ProtectModuleReg(CSCprotect);
  296.    
  297. }

  298. void DMA_Init(void)
  299. {
  300.          DMA_BaseInitTypeDef DMATestPattern;

  301.     // ------------------------------------------------------------------------
  302.     // 1.Enable DMA
  303.     DMA_Cmd(ENABLE);
  304.    
  305.     // ------------------------------------------------------------------------
  306.     // 2.Enable Channel0
  307.     DMA_Channel_Cmd(DMAChannel0, ENABLE);
  308.    
  309.     // ------------------------------------------------------------------------
  310.     DMA_BaseInitStructure_Init(&DMATestPattern);
  311.    
  312.     // 3.initial & modify parameter
  313.       
  314.         // DMA channel select
  315.         DMATestPattern.DMAChx = DMAChannel0;
  316.         
  317.         // channel x source/destination auto increase address
  318.         DMATestPattern.SrcSINCSel = DISABLE;
  319.         DMATestPattern.DestDINCSel = ENABLE;
  320.         
  321.         // DMA source peripheral config
  322.         DMATestPattern.SrcSymSel = DMA_ADC0_IN;
  323.         
  324.         // DMA destination peripheral config
  325.         DMATestPattern.DestSymSel = DMA_MEM_Wrtie;
  326.         
  327.         // DMA Burst size config
  328.         DMATestPattern.BurstDataSize = DMA_BurstSize_1Byte;
  329.         
  330.         // DMA transfer data count initial number
  331.         DMATestPattern.DMATransferNUM = 20;
  332.    
  333.         // source/destination config
  334.                                 DMATestPattern.DMASourceAddr = &ADC0->DAT0;
  335.         DMATestPattern.DMADestinationAddr = (uint32_t *)&RcvBuf;
  336.                                
  337.                                                  // Setting M2M simple parameter
  338.                                                  
  339.                                 ADC_DMA_Cmd(ADC0, ENABLE);
  340.                                 DMA_Channel_Cmd(DMAChannel0, ENABLE);
  341.         DMA_Base_Init(&DMATestPattern);
  342.                
  343.        
  344. }


  345. int main()
  346. {
  347.         int i;
  348.         double x;
  349.         PIN_InitTypeDef PINX_InitStruct;
  350.        
  351.         CSC_Init();
  352.         Sample_URT0_Init();
  353.         Sample_TM36_PWM();
  354.         ADC_Init();

  355.        
  356.         //==Set GPIO init
  357.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                                                                 // Pin select Push Pull mode
  358.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;                                  // Enable pull up resistor
  359.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  360.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                                                         // Pin output driver full strength.
  361.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;                        // Pin input deglitch filter clock divider bypass
  362.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                                                         // Pin input data not inverse

  363.         PINX_InitStruct.PINX_Alternate_Function  = 6;                                                                                                                // Pin AFS = TIM36 OC10
  364.         GPIO_PinMode_Config(PINC(2),&PINX_InitStruct);                                                                                                   // Set PC6 function
  365.        
  366.         PINX_InitStruct.PINX_Alternate_Function  = 6;                                                                                                                // Pin AFS =TIM36 trigger output
  367.         GPIO_PinMode_Config(PINC(7),&PINX_InitStruct);                                                                                                   // Set PC2 function
  368.        
  369.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_Analog_IO;                                                                 // Pin select Analog Input/Output mode
  370.         PINX_InitStruct.PINX_Alternate_Function  = 0;                                                                                                                // Pin AFS = GPA
  371.         GPIO_PinMode_Config(PINA(4),&PINX_InitStruct);                                                                                            // Set PA4 function

  372.         printf("hello\n");
  373.         i=0;

  374.         while(1)
  375.         {               
  376.                
  377.                 i++;
  378.             if(i>=500000)
  379.             {
  380.                                 i=1;
  381.                 while(ADC_GetSingleFlagStatus(ADC0, ADC_E1CNVF) == DRV_UnHappened);
  382.     ADC_ClearFlag(ADC0, ADC_E1CNVF);
  383.                
  384.                 x=((ADC_GetDAT0Data(ADC0)*5)/4096.0);    //This is the Voltage of Verf.

  385.                 printf("%lf\n",x);
  386.                    }
  387.                
  388.         }       

  389. }




















复制代码
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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