I did a specialized (resonant: induction heating) control on MCU a couple years ago. Still a bit sketchy in places, but seems to run alright. The innermost loop was relatively noisy, I think a combination of poor ADC ranging, time quantization noise (as the sampling points shift phase by whole clock cycles -- variable frequency control scheme, so all the timing is referenced to a master "VCO"), and relatively low Q load (so, while it's relatively insensitive to small changes in frequency, it also responds quickly to them). The overall (averaged over enough cycles) behavior was fine though; good power calibration in particular.
I don't have a problem doing a more conventional, say peak or average current mode control, either; I haven't, but just because I have no reason to do it. Doing something like, oh, PFC maybe, would be more challenging I think. Maybe comparable to the resonant control in scope (which isn't so difficult by itself, but the particular hardware I was using, and other software features implemented, made for a pretty solid amount of project).
Mind, I'm speaking from years of experience. It's been many more years in which I've contemplated doing such a control, and either solved it better in analog anyway, or "chickened out" because software is such an unreliable way to construct a control system. And that's not to say I'm a poor coder -- quite on the contrary, my knowledge of software in general, and of my own abilities, is precisely why I approach such projects with the utmost care, and generally prefer to avoid them. When it only takes one slipped clock cycle to blow up your transistors, you don't take risks.
So, I absolutely do not recommend beginners take on such a problem. Not as a requirement for a project. If you do -- do so from a purely academic angle. Understand what switching is actually doing (namely: controlling inductor current). Understand how to design and tune a control loop. Understand when and how to protect against fault conditions. What fault conditions should you expect? (Input and output over/under voltage, overcurrent, startup transients; component failures and other FMEA if you like; etc.) How to solve them? Implement a control in hardware first -- analog and digital circuitry, no MCU involved. Read SMPS controller/regulator datasheets, understand their block diagrams; construct them yourself from discrete components (amps, comparators, logic, etc.).
The easiest option -- and still a classic -- is to keep the busy work in hardware, and e.g. run the setpoints from DAC channels from an MCU. (By "classic", I mean they had no choice but to do it this way since CPUs and MCUs were introduced in the 70s or so, at pitiful speeds (imagine, 1 MIPS was "fast"!). It remains an excellent architecture for safety purposes, however!) That way, even if the CPU locks up, the worst that can happen is the setpoints freeze in place. A watchdog (external, in hardware!) can detect this and disable the circuit without ever exceeding nominal conditions.
Read the MCU datasheet in detail, and make use of hardware features; SMPS-centric timers and configurable logic are widely available nowadays, greatly reducing the amount of work the CPU has to do. Understand your toolchain in great detail; if you aren't inspecting the ASM output, you're probably not at a deep enough level of understanding that you will do a better job than "programming in solder". (Which is, after all, a kind of "assembly" language.

) Needless to say, anything Arduino dependent is purely academic -- you might be able to demo a basic control loop using those libraries; but a complete, reliable, high performance system? No way.
Tim