void myThread::TimerUpdate() { emit deviceAmbient(); pwm_test(duty_value/10.0); }
int main_cm3 ( void ) { #if 1 // go for 120MHz, built into libopencm3 // requires: external 8MHz crystal on pin5/6 with associated caps to ground rcc_clock_setup_hse_3v3 ( &hse_8mhz_3v3 [ CLOCK_3V3_120MHZ ] ); #endif // wait a sec, so we have a reflash opportunity before things get funky // lame_delay_ms ( 2000 ); // initialize USART1 @ 9600 baud // init_usart1 ( 9600 ); usart_puts ( 1, "Init usart1 complete! Hello World!\r\n" ); //usart_puts ( 2, "Init usart2 complete! Hello World!\r\n" ); // PWM setup #if 0 usart_puts ( 1, "usart1 pwm test start!\r\n" ); pwm_test(); usart_puts ( 1, "usart1 pwm test complete!\r\n" ); #endif // MPU setup #if 0 mpu_test(); usart_puts ( 1, "usart1 mpu test complete!\r\n" ); #endif // balance! #if 1 usart_puts ( 1, "usart1 - enter balance mode!\r\n" ); balance_or_die(); #endif //__enable_irq(); //cm_enable_interrupts(); while ( 1 ) { __asm__("nop"); } // while forever return 0; }
int main(int argc, char *argv[]) { if(1 != bcm2835_init()) return FAIL; if(argc != 2) { uSage(); return FAIL; } if (0 == strcasecmp(argv[1], "out")) { out_test(); } else if (0 == strcasecmp(argv[1], "pud")) { pud_test(); } else if (0 == strcasecmp(argv[1], "edge")) { edge_test(); } else if(0 == strcasecmp(argv[1], "pwm")) { pwm_test(); } else if(0 == strcasecmp(argv[1], "i2c")) { i2c_test(); } else if(0 == strcasecmp(argv[1], "spi")) { spi_test(); } else { uSage(); return FAIL; } bcm2835_close(); return 0; }
/********************************** 函数实现区 *********************************/ void pwm_init(void) { uint32_T pre_scale_val = 0; /* * * 将计数器时钟设置为:15MHz, 计算预分频值 * PWM_TIMCLK使用 APB1 的时钟 即 HCLK/2 * * 预分频值: * pre_scale_val = (APB1_CLK / PWM_TIM_CLK ) - 1 * => pre_scale_val = ((SystemCoreClock / 2 ) /15 MHz) - 1 * */ pre_scale_val = (uint32_t)((SystemCoreClock/2) / 15000000) - 1; /* * 设置周期为:1000 便于编程 * ARR = (PWM_TIM源时钟/PWM_TIM输出频率) - 1 * => PWM_TIM输出频率 = PWM_TIM源时钟 / (ARR + 1) * ARR = 1000 * PWM_TIM源时钟:15MHz * => PWM_TIM输出频率 = 15000000 / (1000 + 1) * = 14.985 kHz * * 设置PWM_TIM输出频率为20 KHz, 周期(ARR)为: * ARR = (PWM_TIM源时钟/PWM_TIM输出频率) - 1 * = 749 * */ s_period = 1000; /* 配置PWM_TIM计数器: * Initialize PWM_TIM peripheral as follows: * Prescaler = (SystemCoreClock / 2 / 15000000) - 1 * Period = (750 - 1) * ClockDivision = 0 * Counter direction = Up * */ s_tim_handle.Instance = PWM_TIM; s_tim_handle.Init.Prescaler = pre_scale_val; s_tim_handle.Init.Period = s_period; s_tim_handle.Init.ClockDivision = 0; s_tim_handle.Init.CounterMode = TIM_COUNTERMODE_UP; s_tim_handle.Init.RepetitionCounter = 0; if (HAL_TIM_PWM_Init(&s_tim_handle) != HAL_OK) { ERR_STR("执行失败."); } /* 各通道的占空比计算如下: * PWM_TIM_Channel1 占空比 = (PWM_TIM_CCR1/ PWM_TIM_ARR + 1)* 100 * PWM_TIM Channel2 占空比 = (PWM_TIM_CCR2/ PWM_TIM_ARR + 1)* 100 * PWM_TIM Channel3 占空比 = (PWM_TIM_CCR3/ PWM_TIM_ARR + 1)* 100 * PWM_TIM Channel4 占空比 = (PWM_TIM_CCR4/ PWM_TIM_ARR + 1)* 100 * * 初始化的时候占空比全0 */ /* 所有通道都需要 */ s_sConfig.OCMode = TIM_OCMODE_PWM1; s_sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; s_sConfig.OCFastMode = TIM_OCFAST_DISABLE; s_sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; s_sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; s_sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; /* 测试电机 */ pwm_test(); /* 关闭电机 */ pwm_off(); return; }