Thông báo

Collapse
No announcement yet.

Thay đổi chu kỳ xung

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Thay đổi chu kỳ xung

    em có đoạn code sau vẫn chưa hiểu mấy mong các bác giúp đở.Vậy em muốn cho xung ra có chu kỳ khoảng 20ms thì phải làm thế nào
    em mới bắt đầu học AVR mong mọi người giúp đở

    /**
    ************************************************** ****************************
    * @file TIM_PWM_Output/main.c
    * @author MCD Application Team
    * @version V1.0.0
    * @date 19-September-2011
    * @brief Main program body
    ************************************************** ****************************
    * @attention
    *
    * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
    * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
    * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
    * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
    * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
    * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
    *
    * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
    ************************************************** ****************************
    */

    /* Includes ------------------------------------------------------------------*/
    #include "stm32f4_discovery.h"

    /** @addtogroup STM32F4_Discovery_Peripheral_Examples
    * @{
    */

    /** @addtogroup TIM_PWM_Output
    * @{
    */

    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    uint16_t CCR1_Val = 333;
    uint16_t CCR2_Val = 249;
    uint16_t CCR3_Val = 166;
    uint16_t CCR4_Val = 1100;
    uint16_t PrescalerValue = 0;

    /* Private function prototypes -----------------------------------------------*/
    void TIM_Config(void);

    /* Private functions ---------------------------------------------------------*/

    /**
    * @brief Main program
    * @param None
    * @retval None
    */
    int main(void)
    {
    /*!< At this stage the microcontroller clock setting is already configured,
    this is done through SystemInit() function which is called from startup
    file (startup_stm32f4xx.s) before to branch to application main.
    To reconfigure the default setting of SystemInit() function, refer to
    system_stm32f4xx.c file
    */

    /* TIM Configuration */
    TIM_Config();

    /* -----------------------------------------------------------------------
    TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles.

    In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),
    since APB1 prescaler is different from 1.
    TIM3CLK = 2 * PCLK1
    PCLK1 = HCLK / 4
    => TIM3CLK = HCLK / 2 = SystemCoreClock /2

    To get TIM3 counter clock at 28 MHz, the prescaler is computed as follows:
    Prescaler = (TIM3CLK / TIM3 counter clock) - 1
    Prescaler = ((SystemCoreClock /2) /28 MHz) - 1

    To get TIM3 output clock at 30 KHz, the period (ARR)) is computed as follows:
    ARR = (TIM3 counter clock / TIM3 output clock) - 1
    = 665

    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%

    Note:
    SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file.
    Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
    function to update SystemCoreClock variable value. Otherwise, any configuration
    based on this variable will be incorrect.
    ----------------------------------------------------------------------- */

    /* Compute the prescaler value */
    PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 28000000) - 1;

    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 665;
    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel2 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel3 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

    TIM_OC3Init(TIM3, &TIM_OCInitStructure);

    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel4 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

    TIM_OC4Init(TIM3, &TIM_OCInitStructure);

    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM3, ENABLE);

    /* TIM3 enable counter */
    TIM_Cmd(TIM3, ENABLE);

    while (1)
    {}
    }

    /**
    * @brief Configure the TIM3 Ouput Channels.
    * @param None
    * @retval None
    */
    void TIM_Config(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;

    /* TIM3 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    /* GPIOC and GPIOB clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB, ENABLE);

    /* GPIOC Configuration: TIM3 CH1 (PC6) and TIM3 CH2 (PC7) */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* GPIOB Configuration: TIM3 CH3 (PB0) and TIM3 CH4 (PB1) */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Connect TIM3 pins to AF2 */
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3);
    }

    #ifdef USE_FULL_ASSERT

    /**
    * @brief Reports the name of the source file and the source line number
    * where the assert_param error has occurred.
    * @param file: pointer to the source file name
    * @param line: assert_param error line source number
    * @retval None
    */
    void assert_failed(uint8_t* file, uint32_t line)
    {
    /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

    while (1)
    {}
    }
    #endif

    /**
    * @}
    */

    /**
    * @}
    */

    /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

  • #2
    ngôn ngữ lập trình ngó lạ quá ko hiểu nên chỉ có thể chỉ hướng thôi, 20ms là chu kì khá lớn cho 1 xung nên ko dùng PWM cứng của AVR được mà phải dùng ngắt timer can thiệp, canh xem cái ngắt có chu kì lâu nhất là bao nhiêu rồi tính xem ngắt bao nhiêu lần thì được 20ms. Cứ thế mà lần.
    Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
    Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

    Comment


    • #3
      b này chạy từ clb mohinh sang dtvn vất vả nhẩy? điều khiển esc brushless phải không ? bạn nên tìm hiểu thiết bi cơ bản TEST SERVO , rồi hãng phát triển thêm
      không thể làm những gì bạn muốn,hãy làm những gì bạn có thể làm .Đời không như mơ

      Comment


      • #4
        Nguyên văn bởi fantasy Xem bài viết
        b này chạy từ clb mohinh sang dtvn vất vả nhẩy? điều khiển esc brushless phải không ? bạn nên tìm hiểu thiết bi cơ bản TEST SERVO , rồi hãng phát triển thêm
        ok là mình, mình đang làm đề tài về cân bằng thanh bằng AVR, nghe nói động cơ Brushless chỉ hoạt động ở chu kỳ khoảng 20ms.
        bài trên là demo cua STM32F4-Dícovery đã chạy nhưng không chạy trên động cơ mình được nên tham khảo ae

        Comment


        • #5
          Nguyên văn bởi hoahauvn2 Xem bài viết
          ngôn ngữ lập trình ngó lạ quá ko hiểu nên chỉ có thể chỉ hướng thôi, 20ms là chu kì khá lớn cho 1 xung nên ko dùng PWM cứng của AVR được mà phải dùng ngắt timer can thiệp, canh xem cái ngắt có chu kì lâu nhất là bao nhiêu rồi tính xem ngắt bao nhiêu lần thì được 20ms. Cứ thế mà lần.
          code trên là demo của ST về STM32F4-Discovery đó bạn

          => TIM3CLK = HCLK / 2 = SystemCoreClock /2
          ................
          TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%

          đoạn code trên mình không hiểu giá trị của HCLK và TIM3_ARR là bao nhiêu nên không tính được chu kỳ mỗi xung

          Comment


          • #6
            Nguyên văn bởi nobita91_201 Xem bài viết
            ok là mình, mình đang làm đề tài về cân bằng thanh bằng AVR, nghe nói động cơ Brushless chỉ hoạt động ở chu kỳ khoảng 20ms.
            bài trên là demo cua STM32F4-Dícovery đã chạy nhưng không chạy trên động cơ mình được nên tham khảo ae
            muốn biết esc brushless chay với tín hiệu như thế nào thì bạn kiếm cái TEST SERVO ,sau đó cho nó hiển thị xung trên OSC xem tín hiệu xung nó ra sao

            độ rộng xung PPM của các esc brushless trên thi trường đa phần ở mức 0.8ms tới 2,2 ms

            nó có chức năng khóa ga nếu như bạn để maximum ngay khi bât công tắc RX .Vidu max signal là 2,2ms .

            đua tôi xem cái linh STM324 ,,,, gì đó mà bạn đã làm xem thế nào
            không thể làm những gì bạn muốn,hãy làm những gì bạn có thể làm .Đời không như mơ

            Comment


            • #7
              demo
              - Xem tab design resource: STM32F4DISCOVERY - STMicroelectronics

              - Kít mở rộng của STM32F4 discovery: Gemeinde: STM32F4DISCOVERY Expansion Boards - element14

              Comment


              • #8
                Nguyên văn bởi fantasy Xem bài viết
                muốn biết esc brushless chay với tín hiệu như thế nào thì bạn kiếm cái TEST SERVO ,sau đó cho nó hiển thị xung trên OSC xem tín hiệu xung nó ra sao

                độ rộng xung PPM của các esc brushless trên thi trường đa phần ở mức 0.8ms tới 2,2 ms

                nó có chức năng khóa ga nếu như bạn để maximum ngay khi bât công tắc RX .Vidu max signal là 2,2ms .

                đua tôi xem cái linh STM324 ,,,, gì đó mà bạn đã làm xem thế nào

                cac demo co ban cua hang st.zip

                Comment

                Về tác giả

                Collapse

                nobita91_201 Tìm hiểu thêm về nobita91_201

                Bài viết mới nhất

                Collapse

                Đang tải...
                X