- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2024-01-04 11:34:35
注册会员
- 积分
- 110
|
发表于 2024-1-3 11:43:07
|
显示全部楼层
void STC8H1K16_pwm2_init(unsigned char PWM_CH,unsigned long int freq)
// unsigned long int duty)
{
unsigned int match_temp = 0;
unsigned int period_temp = 0;
unsigned int freq_div = 0;
P_SW2 |= 0x80;
freq_div = (sys_clk / freq) >> 15; //分频
period_temp = sys_clk / freq / (freq_div + 1);
PWM2_ENO |= (1 << ((2 * ((PWM_CH >> 4) - 4)))); //使能输出
PWM2_PS |= ((PWM_CH & 0x03) << ((2 * ((PWM_CH >> 4) - 4)))); //输出脚选择
// 配置通道输出使能和极性
(*(unsigned char volatile xdata*)(PWM2_CCER1_ADDR + (((PWM_CH >> 4) - 4) >> 1))) |= (1 << (((PWM_CH >> 4) & 0x01) * 4));
//通道模式配置
(*(unsigned char volatile xdata*)(PWM2_CCMR1_ADDR + ((PWM_CH >> 4) - 4))) |= 0x06 << 4; //
(*(unsigned char volatile xdata*)(PWM2_CCMR1_ADDR + ((PWM_CH >> 4) - 4))) |= 1 << 3; //PWM模式2
//设置周期时间(高字节先写入)
//PWM2_ARR = (uint16)period_temp;
PWM2_ARRH = period_temp >> 8;
PWM2_ARRL = period_temp;
//PWM2_ARR=2000;
//PWM预分频(高字节先写入)
PWM2_PSCRH = freq_div >> 8;
PWM2_PSCRL = freq_div;
//设置占空比(高字节先写入)
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4))) = match_temp >> 8;
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4) + 1)) = match_temp;
PWM2_BKR = 0x80; //使能主输出
PWM2_CR1 = 0x01; //PWM开始计时
}
void STC8H1K16_pwm2_set_duty(unsigned char PWM_CH,
unsigned int duty)
{
unsigned int match_temp;
match_temp = PWM2_ARRH;
match_temp = match_temp << 8;
match_temp = match_temp + PWM2_ARRL;
match_temp = match_temp * ((float)duty / PWM_DUTY_MAX); //占空比
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4))) = match_temp >> 8;
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4) + 1)) = match_temp;
} |
|